6-3 傳值呼叫 與 傳參考呼叫
傳值呼叫(call by value)
在叫用函數時,我們通常都會傳入數個參數給該函數,例如底下這個求等差數列第 n 項的函數 An()。
int An(int a, int d, int n)
{
return a+(n-1)*d;
}
int main()
{
cout << An(1, 2, 10) << endl; // 19
cout << An(2, 3, 5) << endl; // 14
return 0;
}
你可以這樣想像,在第 9 行叫用 An(1, 2, 10) 的時候
- An 產生了 a, d, n 這三個變數,用來承接傳入的參數
- a 接收到了 1, d 接收到了2, n 接收到了 10
- 回傳 a+(n-1)*d 的運算結果
- An 之前產生的 a, d, n 三個變數消滅
- 返回叫用函數的地方(第9行),繼續執行下去。
當第 10 行叫用 An(2, 3, 5) 的時候,以上流程會再發生一次。請注意 2 個重點:
- a, d, n 都是區域變數,當 An() 被叫用時會產生一份區域變數,返回時這些區域變數就會消滅。
- 叫用 An() 時,參數的「值」被複製一份給 a, d, n。所以我們叫它 傳「值」呼叫(call by value)。
接下來這個 exchange 函數會讓你把這個機制的第2個重點看得更清楚。
void exchange(int a, int b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int a = 3;
int b = 5;
exchange(a, b);
cout << "a = " << a << endl; // a = 3
cout << "b = " << b << endl; // b = 5
return 0;
}
第 13 行叫用 exchange(a, b)時,在 main() 裡的 a, b 和 exchange() 裡的 a, b 是互不相關的。
外面的(main的) a, b 只是把它當下的值複製一份傳給裡面的(exchange的) a, b。
在函數裡的 a, b 在 t 的協助下互相交換其值,並且在離開函數回到 main 裡繼續執行前,函數裡的 a, b, t 都消滅了。
函數結束回到 main 裡,接著用 cout 輸出 a, b,這個被輸出的是 main 的 a, b。由於剛才互相交換值的是 exchange 函數內的 a, b,和現在 main 的 a, b 一點關係都沒有,所以輸出的 a 還是 3,b 還是 5。