指针在 函数传址调用 与 数组传参 中的应用(详细解析)

目录

一.传址调用

1.何时用?

2.如何用?(通过例题分析)

二.数组传参

1.指针接收

2.数组接收

3.总结

4.指针,数组接收对照写法(例题)

(1)指针接收写法

(2)数组接收写法(只写函数调用部分)

(3)相互使用(本质相同)

5.总结


紧接上期小编分享的指针在非函数当中的使用,这期小编为大家带来指针在 函数传址调用 与 数组传参 中的应用。

一.传址调用

1.何时用?

对于涉及形参修改实参的情况,我们使用传址调用。把地址给你,就可以远程操控。

2.如何用?(通过例题分析)

题目:写一个函数可以交换2个整型变量的内容。

#include<stdio.h>
void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:%d %d\n", a, b);

	Swap(&a, &b);// 传地址!
	printf("交换后:%d %d\n", a, b);

	return 0;
}

我们分别用指针变量 pa pb 来接收 a b 的地址,类型为整型,用 int*

找到了 a b 的地址,用 * 解引用操作符来操控 a b ,实现远程操控的效果。不需要返回值,所以函数类型用 void

是否发现指针用起来顺手很多呢?

二.数组传参

这里我们要提前知道一个结论:数组名其实是首元素的地址

1.指针接收

例题:模拟实现 strlen (计算字符串长度)

int my_strlen(char* str)//返回类型为整型,函数类型用 int
{
	int count = 0;

	return count;
}

int main()
{
	char arr[] = "abc";
	//[a b c \0]
	int len = my_strlen(arr); //定义变量用于接收函数返回值
	printf("%d", len);

	return 0;
}

由结论知:数组名是 b 的地址,b 的地址是字符的地址,字符的地址应该放到字符指针当中,所以接收类型要用 char*

定义和接收都搞定了,怎么用呢?      下面是调用函数中间缺失的几行代码

	while (*str != '\0')
	{
		count++;
		str = str + 1;
	}

先来看 *str 是什么意思:

地址是首格的编号,存到 str 中 ,str 就是个指针变量

 str 里面存的是这个位置的地址*str 是 str 指向的空间,即 a

用一幅图来理解:

2.数组接收

下面这段代码,数组传参,数组接收,你是否认为这更加合理呢?

void my_strlen(char str[])
{
	int r = sizeof(str);
}

int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr);

	my_strlen(arr);

	printf("%d", sz);

	return 0;
}

代码打印出sz=7  

可进入函数内调试呢?

void my_strlen(char* str)
{
	int r = sizeof(str);
}

如果这样写,r 还是 4 。    为什么呢?

因为在这里,sizeof 计算的是指针变量的大小,str 是指针变量,sizeof(str)在x86下为4,x64下为8 。 跟字符串没有关系(自己以为是在计算字符串所占空间大小)

想要在调用函数中计算数组大小,用 strlen

3.总结

数组传参传数组名的话,传过去的就是地址,所以本质就应该是指针(只是看着像数组)

因为指针才能接收传过来的地址

所以即使写成数组的形式,这个地方依然不能用sizeof

4.指针,数组接收对照写法(例题)

例题:写一个函数 reverse_str 实现字符串逆序(不是逆序打印!)

思路:左右两端不断交换

(1)指针接收写法

void reverse_str(char* str)
{
	int l = 0;  //是L的小写,不是数字1
	int r = strlen(str)-1;

	while (l < r)
	{
		char tmp = *(str + l);
		*(str + l) = *(str + r);
		*(str + r) = tmp;
		l++;
		r--;
	}
}

int main()
{
	char arr[] = "abcdef";
	reverse_str(arr);
	printf("%s", arr);

	return 0;
}

(2)数组接收写法(只写函数调用部分)

void reverse_str(char str[])
{
	int l = 0;
	int r = strlen(str)-1;

	while (l < r)
	{
		char tmp = str[l];
		str[l] = str[r];
		str[r] = tmp;
		l++;
		r--;
	}
}

(3)相互使用(本质相同)

void reverse_str(char* str)
{
	int l = 0;
	int r = strlen(str)-1;

	while (l < r)
	{
		char tmp = str[l];
		str[l] = str[r];
		str[r] = tmp;
		l++;
		r--;
	}
}

5.总结

arr [ i ]   等价于 * (arr + i) 

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。