C/C++中的值傳遞,引用傳遞,指針傳遞,指針引用傳遞

在面試過程當中,被面試官問到傳值和傳引用的區別,以前沒有關注過這個問題,今天在網上找了一篇包含代碼和圖片的講解文章,淺顯易懂,遂轉載備忘。面試

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。示意圖以下:

相關文章
相關標籤/搜索