指针做函数参数 (间接赋值是指针存在的最大意义)

写一个子函数供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提供给别人使用的话经常用到

posted on 2019-01-08 10:42  锋邢天下  阅读(449)  评论(0编辑  收藏  举报

导航