2014年5月8日 星期四

[轉] [C++] Call by value、Call by pointer、Call by reference

http://tw.tonytuan.org/2010/03/call-by-valuecall-by-pointercall-by.html

在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++;
}
csie-tw.blogspot.com (1)
這時候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 }
csie-tw.blogspot.com (2)
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 }
csie-tw.blogspot.com
如果寫成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

沒有留言:

張貼留言