這篇主要想講參數傳遞的種類,分別有 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 | int add(int x, int 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
9void 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
9void 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