什麼是 值傳遞,地址傳遞和引用傳遞 有什麼區別
什麼是值傳遞,地址傳遞和引用傳遞?它們有什麼不同?這在學校考試,找工作面試中都是常見的問題。它們之間的區別容易搞錯,長時間不用也容易忘記。最近又被問到這個問題,想想還是整理一下記下來,也方便以後參考。
首先,看以下三段程式碼。
1.
- void swap1(int x, int y)
- {
- int tmp=x;
- x=y;
- y=tmp;
- print(“x=%d, y=%d\n”, x, y);
- }
- void main()
- {
- int a=2,b=7;
- swap1(a,b) ;
-
printf(“a=%d, b=%d\n”, a, b);
- }
輸出結果是什麼?
---
x=7, y=2
a=2, b=7
2.
- void swap2(int *px, int *py)
- {
- int tmp=*px;
- *px=*py;
- *py=tmp;
- print(“*px=%d, *py=%d\n”, *px, *py);
- }
- void main()
- {
- int a=2;
- int b=7;
- swap2(&a,&b);
- Print(“a=%d, b=%d\n”, a, b);
- }
---
*px=7, *py=2
a=7, b=2
3.
- void swap3(int &x, int &y)
- {
- int tmp=x;
- x=y;
- y=tmp;
- print(“x=%d, y=%d\n”, x, y);
- }
- void main()
- {
- int a=2;
- int b=7;
- swap3(a,b);
- Print(“a=%d, b=%d\n”, a, b);
- }
---
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本身的操作,其值發生了對調。