C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別

這篇主要想講參數傳遞的種類,分別有 call by value 傳值, call by pointer 傳址, call by reference 傳參考
這三大種類,也可以叫做 pass by value、pass by address、pass by reference。這幾種種類一定要搞清楚,是寫程式常見的狀況也是常見考題。

主要是 call by pointer 和 call by reference 的本質上有沒有差異, 差在寫法上的差異與使用上方便性。

傳值 call by value

這種參數傳遞方式是最簡單的方式,就是把每個參數都複製一份到函式裡運算,

1
2
3
int add(int x, int y) {
return x + y;
}

但上述這種方式在某些情形變得不適用,例如要修改傳遞進來的參數,或者不想複製一份參數浪費效能,
這時就會採用傳址 call by pointer 或傳參考 call by reference,也就是下面會介紹的內容。

傳址 call by pointer

Call by pointer 又稱 Call by address,但為了跟後面的方式作區分,用 Call by pointer 這名子比較明確,
這邊以最簡單的swap作為範例,
其中在傳址時相當於 int *x = &a; int *y = &b; 這樣的寫法

1
2
3
4
5
6
7
8
9
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}

int a = 3;
int b = 5;
swap(&a, &b);

傳參考 call by reference

這邊也以最簡單的swap作為範例,可以跟上個範例作比較看看寫法上的差異,
其中在傳參考時相當於 int &x = a; int &y = b; 這樣的寫法,
這樣的好處在於之後在函式裡的變數寫法如同一般的變數寫法,

1
2
3
4
5
6
7
8
9
void swap(int &x, int &y) {
int tmp = x;
x = y;
y = tmp;
}

int a = 3;
int b = 5;
swap(a, b);

其他參考
[1] 什麼是傳值call by value、傳址call by address、傳參考call by reference
http://wp.mlab.tw/?p=176
[2]【教學】call by value, call by address, call by reference 差別在哪?
https://wayne265265.pixnet.net/blog/post/112556555
[3]C/C++之指標 (pointer),參考 (reference) 觀念整理與常見問題
https://dotblogs.com.tw/brian/2012/10/18/77588

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ 函式回傳參考用法 function return by reference
C++ std::sort 排序用法與範例完整介紹
std::queue 用法與範例
std::thread 用法與範例
C++ virtual 的兩種用法
C/C++ 判斷檔案是否存在
C++ 設計模式 - 單例模式 Singleton Pattern