1. 程式人生 > >什麼是 值傳遞,地址傳遞和引用傳遞 有什麼區別

什麼是 值傳遞,地址傳遞和引用傳遞 有什麼區別

什麼是值傳遞,地址傳遞和引用傳遞?它們有什麼不同?這在學校考試,找工作面試中都是常見的問題。它們之間的區別容易搞錯,長時間不用也容易忘記。最近又被問到這個問題,想想還是整理一下記下來,也方便以後參考。

首先,看以下三段程式碼。

1. 

  1. void swap1(int x, int y)    
  2. {  
  3.   int tmp=x;  
  4.   x=y;  
  5.   y=tmp;  
  6.   print(“x=%d, y=%d\n”, x, y);  
  7. }  
  8. void main()  
  9. {  
  10.   int a=2,b=7;  
  11.   swap1(a,b) ;  
  12.   printf(“a=%d, b=%d\n”, a, b);  
  13. }  

輸出結果是什麼?

---

x=7, y=2

a=2, b=7

2. 

  1. void swap2(int *px, int *py)  
  2. {  
  3.   int tmp=*px;  
  4.   *px=*py;  
  5.   *py=tmp;  
  6.   print(“*px=%d, *py=%d\n”, *px, *py);  
  7. }  
  8. void main()  
  9. {  
  10.   int a=2;  
  11.   int b=7;  
  12.   swap2(&a,&b);  
  13.   Print(“a=%d, b=%d\n”, a, b);  
  14. }  
這次輸出結果是什麼?

---

*px=7, *py=2

a=7, b=2


3. 

  1. void swap3(int &x, int &y)  
  2. {  
  3.   int tmp=x;  
  4.   x=y;  
  5.   y=tmp;  
  6.   print(“x=%d, y=%d\n”, x, y);  
  7. }  
  8. void main()  
  9. {  
  10.   int a=2;  
  11.   int b=7;  
  12.   swap3(a,b);  
  13.   Print(“a=%d, b=%d\n”, a, b);  
  14. }  
那這次輸出結果又是什麼?

---

x=7, y=2

a=7, b=2

接下來,分析一下為什麼是這樣的結果呢?

上面的1,2,3分別是值傳遞,地址傳遞,和引用傳遞。

先看值傳遞。swap1函式的操作是將x,y進行對調。需要注意的是,對形參的操作不會影響到a,b。我們可以設想,在swap1函式執行語句的最前面,隱含地存在x=a; y=b;這兩條語句,這樣就便於理解了。當a,b把值賦給x,y之後,對x,y不論再做什麼操作,都不會影響到a,b本身。

再看地址傳遞。注意,這時的函式的宣告和呼叫的寫法與值傳遞不同。

函式宣告:swap2(int *px, int *py)

函式呼叫:swap2(&a, &b)

但是與值傳遞的分析一樣,我們同樣可以設想,在swap2函式裡,隱含地存在px=&a; py=&b;這兩條語句,這表示a的地址代入到了px,b的地址代入到了py。這樣一來,對*px, *py的操作就是a,b本身的操作。所以a,b的值被對調了。

接下來看引用傳遞。先看函式的宣告和呼叫的寫法,函式呼叫和值傳遞的寫法是一樣的,但是函式宣告是不一樣的。

函式宣告:swap3(int &x, int &y)

函式呼叫:swap3(a, b)

因為定義的x,y前面有&取地址符,呼叫函式swap3時,a,b分別代替了x,y,即x,y分別引用了a,b變數。因此,函式裡的操作,實際上是對實參a,b本身的操作,其值發生了對調。