在C語言裡裡,傳遞參數的2種方式,分別是Call by value、Call by pointer。而在C++裡多了一個Call by reference的方法。
Call by value
參數以數值方式傳遞,複製一個副本給另一個副程式。EX:
int main() {
int x = 5;
foo(x);
}
void foo(int x) {
x++;
}
這時候main裡的變數x的值被複製到foo裡的x,這兩個x基本上是位於不同的記憶體空間的,也是就foo裡的x在加一後,並不會影響到main裡的x(依然是5)。
Call by pointer
Call by pointer是將變數的address傳到副程式,而副程式使用一個pointer接住這個address,因此副程式的這個pointer可以指向並修改這個數值。EX:
int main() {
int x = 5;
foo(&x);
}
void foo(int *x) {
(*x)++; // 指向,並加1
}
main呼叫foo時,將x的address(&x)傳遞給foo的x pointer,所以x pointer指向回main的x,應此可以修改其數值。(*x)為指向其實體數值,因此(*x)++就是把main的x加1。
Call by reference
Call by reference的作用和目的和Call by pointer是一樣的,都是想要指回原本的變數並且可以修改。不過Call by reference寫起來更簡單。Ex:
int main() {
int x = 5;
foo(x); // 不用加&
}
void foo(int &x) {
x++; // 修改此x就是修改main的x
}
如果寫成call by pointer的方式,麻煩的地方是每次傳address都要加個 & ,而在副程式裡還要加個 * 來指向原本的實體。因此,C++新增了Call by reference的方式,讓在丟變數到副程式時,不用加&,而在副程式參做此變數也不用加*號就可以直接修改其變數。唯一要寫的是:在副程式裡的參數裡加上&,代表是Call by reference。
特別要注意的是,Call by reference的方式,一定要在初始化時就有指向的實體,而且不能改變。如上例中,foo(int &x)裡的x在副程式被呼叫時,就固定指向main的x,不能改變。
例題:
int a = 10, b = 20;
int &x = a; // pointer x一開始就要固定指向實體,這時候是指向a,無法改變。
x++; // a變成11
int *y; // y是一個pointer,可以在一開始不指向任何實體。
y = &b; // y指向b
(*y)++; // b變成21
y = &a; // y改為指向a
(*y)++; // a變成12
4 則留言:
好棒!!!
世界真小~複習的時候找到你這篇:D
謝謝分享
滿詳細的 !! 推
感謝分享
很詳細,感恩!
菩提本無樹,明鏡亦非台;本來無一物,何處惹塵埃?
張貼留言