2017年4月9日 星期日

C++: Call by value/address/reference


  • Call by Value

int main() { 
    int x = 5; 
    foo(x); 
void foo(int x) { 
    x++; 
}
這時候main裡的變數x的值被複製到foo裡的x,這兩個x基本上是位於不同的記憶體空間的,也是就foo裡的x在加一後,並不會影響到main裡的x(依然是5)。


  • Call by address (pointer)
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
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,不能改變。


credit: 藏經閣

沒有留言:

張貼留言