指针做函数参数 (间接赋值是指针存在的最大意义)
写一个子函数供main函数调用,要求交换main中临时变量 int i, int j。 怎么实现?
① 像下面这么写行不行?
void Swap(int a, int b)
{
int buf;
buf = a;
a = b;
b = buf;
return;
}
肯定不行,main函数中调用Swap(i, j)。虽然把形参i,j的值传给了a,b。但是Swap函数中改变的是a,b。根本无法改变 i 和 j的值。
② 在Swap函数中交换a,b的值,然后return a, b的值,用i,j去接收返回值行不行?
也不行,因为return只能返回一个返回值,这儿要改变二个值
③ 用指针做函数参数,给 i,j 间接赋值实现交换i,j 的值,代码如下:
void Swap(int *pa, int *pb)
{
int buf;
buf = *pa;
*pa = *pb;
*pb = buf;
return;
}
int main(void)
{
int i = 1;
int j = 2;
Swap(&i, &j);
printf("i = %d \nj = %d \n", i, j);
return 0;
}
运行结果如下,成功交换i,j的值:
综上: 如果希望在另外一个函数中改变本函数中变量的值,在调用函数时只能传递该变量的地址。
PS: 传指针和传数据相比还有一个好处就是节约内存。我们知道,传数据拷贝的是内存单元的数据,如果数据很多的话拷贝过来都要为它们分配内存。
而传指针的话只需要传递 4 字节的地址就行了。而且传数据非常消耗效率,为形参分配内存需要时间,拷贝需要时间,最后结束了返回还是需要时间。
前面说过,return 时系统会先自动创建一个临时变量来存放返回的值。所以传数据时很消耗效率,而传指针就是为了提高效率。
指针做函数参数很重要,封装API提供给别人使用的话经常用到