在面試過程當中,被面試官問到傳值和傳引用的區別,以前沒有關注過這個問題,今天在網上找了一篇包含代碼和圖片的講解文章,淺顯易懂,遂轉載備忘。面試
1. 值傳遞 spa
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,因此值傳遞沒法改變變量的值。示意圖以下:3d
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。示意圖以下:code
3. 指針傳遞blog
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. 指針的引用傳遞class
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。示意圖以下: