在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘。
1. 值传递
1 void f( int p){ 2 printf("\n%x",&p); 3 printf("\n%x",p); 4 p=0xff; 5 } 6 void main() 7 { 8 int a=0x10; 9 printf("\n%x",&a); 10 printf("\n%x\n",a); 11 f(a); 12 printf("\n%x\n",a); 13 }
通过上例我们可以看到,int a=0x10,存放的地址为0x12ff44,值为10,当调用f(a)时,传递给p的值为10,但是p的地址为0x12fef4,当改变p=0xff,时是改变地址为0x12fef4中的内容,并没有改变0x12ff44中的内容,所以调用f(a),后a的值仍然为0x10,所以值传递无法改变变量的值。示意图如下:
2. 引用传递
1 void f( int & p){ 2 printf("\n%x",&p); 3 printf("\n%x",p); 4 p=0xff; 5 } 6 void main() 7 { 8 int a=0x10; 9 printf("\n%x",&a); 10 printf("\n%x\n",a); 11 f(a); 12 printf("\n%x\n",a); 13 }
通过上面引用传递传递案例我们可以看到,调用f(a)时,传递给p的是a的地址,所以p和a的地址都是0X12ff44,所以p就是a,改变p当然能改变a。示意图如下:
3. 指针传递
1 void f( int*p){ 2 printf("\n%x",&p); 3 printf("\n%x",p); 4 printf("\n%x\n",*p); 5 *p=0xff; 6 } 7 void main() 8 { 9 int a=0x10; 10 printf("\n%x",&a); 11 printf("\n%x\n",a); 12 f(&a); 13 printf("\n%x\n",a); 14 }
通过指针传递的案例我们可以看到,调用f(&a)是将a的地址0x12ff44传递给p,则*p就指向了a的内容,改变*p后,a的内容自然就改变了,示意图如下:
4. 指针的引用传递
1 void f( int*&p){ 2 printf("\n%x",&p); 3 printf("\n%x",p); 4 printf("\n%x\n",*p); 5 *p=0xff; 6 } 7 void main() 8 { 9 int a=0x10; 10 printf("\n%x",&a); 11 printf("\n%x\n",a); 12 int *b=&a; 13 printf("\n%x",&b); 14 printf("\n%x",b); 15 printf("\n%x\n",*b); 16 f(b); 17 printf("\n%x\n",a); 18 }
为了使用指针的引用传递我们要新建一个指针b,然后将b的引用传递给p,其实p就是b的一个拷贝,*p=*b都指向a,所以改变*p的内容也就改变a的内容。示意图如下:
我们再来看一下如果不用指针的引用传递会出现什么结果
1 void f( int*p){ 2 printf("\n%x",&p); 3 printf("\n%x",p); 4 printf("\n%x\n",*p); 5 *p=0xff; 6 } 7 void main() 8 { 9 int a=0x10; 10 printf("\n%x",&a); 11 printf("\n%x\n",a); 12 int *b=&a; 13 printf("\n%x",&b); 14 printf("\n%x",b); 15 printf("\n%x\n",*b); 16 f(b); 17 printf("\n%x\n",a); 18 printf("\n%x\n",b); 19 }
从结果中我们可以看到调用f(b)时,传递给p的是b的内容,但是&b,和&p是不一样的,虽然*p和*b都指向a。示意图如下:
本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5163280.html,如需转载请自行联系原作者