- Call by Value
int main() { 
int x = 5;
foo(x);
}
int x = 5;
foo(x);
}
這時候main裡的變數x的值被複製到foo裡的x,這兩個x基本上是位於不同的記憶體空間的,也是就foo裡的x在加一後,並不會影響到main裡的x(依然是5)。
- Call by address (pointer)
int main() { 
int x = 5;
foo(&x);
}
int x = 5;
foo(&x);
}
void foo(int *x) { 
(*x)++; // 指向,並加1 }
(*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); // 不用加& }
int x = 5;
foo(x); // 不用加& }
void foo(int &x) { 
x++; // 修改此x就是修改main的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: 藏經閣



 
沒有留言:
張貼留言