2010/03/17

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

在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

4 則留言:

Unknown 提到...

好棒!!!
世界真小~複習的時候找到你這篇:D

李東翰 提到...

謝謝分享

Unknown 提到...

滿詳細的 !! 推
感謝分享

Unknown 提到...

很詳細,感恩!

菩提本無樹,明鏡亦非台;本來無一物,何處惹塵埃?

2024年React state management趨勢

輕量化 在過去Redux 是 React 狀態管理的首選函式庫。 Redux 提供了強大的功能和靈活性,但也帶來了一定的學習成本和複雜度。 隨著 React 生態的不斷發展,越來越多的開發者開始追求輕量化的狀態管理函式庫。 Zustand 和 Recoil 等庫以其簡單易用、性...