函数参数指针与引用的区别

 前几日学习C++的时候遇到了这个问题,其实原来在上学的时候也纠结过这个问题。
于是去网上寻找答案,思考过后得到自己的理解。
我们就拿我们最经典的swap()函数来说吧。
声明void swap(int a,int b)
{
  int temp;
temp=a;
  a=b;
  b=temp;
 } 

 那我们解释一下为什么这个交换不能成功,大家好好回忆一下大学时是怎么学的,老师是怎么说的。

 我们说呀,参数是如何起作用的?这个问题非常关键,如果你搞清楚了,你就能直接回答出指针与引用的区别,太他妈明显了。

  我们调用一个函数,this.swap(a,b);事实上我们只是把值传递进了函数,过程应该是这样的,首先在定义函数的时候 ,函数定义了一个局部变量表,表里分别是a,b,当我们调用swap()的时候,把外部的a赋值给swap的a,把外部的b赋值给swap的b,所以在swap()内部用的时候实际是一直是在操作内部的a,b,而外部的a,b在函数的参数括号里面就已经完成任务了,所以对外部一点儿影响都没有。

  那这样就可以解释我们的指针与引用的区别了,也是说参数是一份外部数据实体的一份复制。

  我们看void swap(int *a,int *b)我们从声明上看,如何解释,很明显,传递的参数是a,b的指针。那么swap()的局部变量表里面就应该存放的就是a,b的指针的值,就是把外部a,b的指针传给a,b,只不过指针毕竟与值不一样,用同样的指针都是可以控制内存区域的内容的,所以用指针修改外部a,b的值也是有效的。

  再看void swap(int &a,int &b)同样从声明上看,传递的参数是a,b的引用,什么叫a,b的引用,就是与a,b的地址,那这里的地址与上面的地址有什么不同呢,大家看看调用的时候 有什么不同。

  传指针:this.swap(&a,&b);

  传引用:this.swap(a,b);

  传指针时,传入的是a,b的地址,就是说swap()参数表里建立两个指针变量,a,b,然后把外部a,b的地址写进去。

  传引用时,大家看,从调用上看参数,a,b参数是意义明显不是一个指针变量,而是一个正常的整形变量,那么传入的明明就是地址呀,没错,传入的就是地址,只不过呀,参数表里的a,b两个变量和外面的a,b两个变量指同一片内存区域。也就是使外部的a,b的指针与参数表里的a,b指针相同。指针相同,在函数里面操作a,b与外面操作a,b效果完全相同。

  从上面来看,引用与指针是有着本质不同的,两者虽然都强调一个地址的概念,但是最终表示的类型却不相同,引用表示指向某一区域的变量,而指针表示指向某一区域的地址。我们可以这样表示 ,假设引用为 a, 指针为p,那么 &a=p , *p=a;
(郭旭杰,软技)

猜你喜欢

转载自blog.csdn.net/u011442439/article/details/76619732