為什麼這篇call by address例子鄉民發文收入到精華區:因為在call by address例子這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者khoguan (Khoguan Phuann)看板C_and_CPP標題[FAQ集] 函式:p...
ptt.cc BBS 站 C_and_CPP 板 FAQ (0.1版)
函式語法
Q: 什麼是 pass by value, pass by address, 與 pass by reference?
(call by value, call by address, call by reference)
A: 是指在呼叫函式,傳入引數時所用的不同機制。
這幾個名詞很多爭議啦。在 C/C++ 的世界中,嚴格說來,C 語言只有 pass
by value 的機制,也就是在呼叫函式時,只能傳入引數的值,而不能傳入
引數本身。
C 要在被呼叫端(callee)中,改變呼叫端(caller)的東西(object)的值,
是透過傳入該物件的位址值(指標)的方式,然後在 calee 中,提取
(dereference,又譯為解參照)該指標,間接的修改到 caller 的 object
的值。呼叫端在呼叫時,必須在變數名稱前加上 & 運算子。這種方式有人
把它叫做 pass by address,最好避免使用這種說法。它在本質上仍是
pass by value。
C 並沒有 pass by reference,是 C++ 從別的語言引進的。呼叫端只要直
接使用變數名稱傳進去,被呼叫端即能修改到呼叫端這個變數的值。當然,
這個變數本身必須是可修改的左值(modifiable lvalue)。
過去,常常將 pass by address 和 pass by reference 當做同義詞。但因
為上述的混亂,所以筆者個人不建議在討論 C/C++ 使用 "pass by address"
的說法,不過倒是可以說 pass the ddress of a variable to a funtion
或是「傳入一個變數的位址給一個函式」。
int square(int i) /* pass by value */
{
return i * i;
}
void square_me(int *pi) /* 本質上仍只是 pass by value */
{
*pi *= *pi;
}
void square_me(int& rp) // C++ 才有的 pass by reference
{
rp *= rp;
}
-----------------------------------
敬請指正錯誤,或提出更合適的答案。
> -------------------------------------------------------------------------- <
作者: cppOrz (cppOrz) 看板: C_and_CPP
標題: Re: [FAQ集] 函式:pass by value/address/reference
時間: Fri Sep 2 01:52:30 2005
很重要的一個 FAQ,尤其是「C 其實只有 pass by value」這個觀念。
實際上 reference to V 在語義上相當於 const pointer to V,
但在語法上,reference 較為簡潔。
square_me 的例子展現了 pointer 具有和 reference 相同的能力
(也就是 callee 可以改變 caller 的語義),但這個例子好像沒有解釋
為何它是「pass by value」這件事。
例①:簡單的 pass by value
int p = 1;
foo(p);
void foo(int q)
{
cout << p; // p 是 1
cout << q; // q 也是 1
q = 2;
cout << q; // q 變成 2
cout << p; // p 仍是 1
}
在函式 foo 中,傳入的變數 p,被建立了一個複本 q,後者只是
函式內部的一個區域變數,無論怎麼改變,都不影響外界的變數 p
我們把這種傳入函式時複製的動作叫 pass by value。
例②:仍然是 pass by value
int v1 = 3;
int v2 = 5;
int* p = &v1;
foo(p);
void foo(int* q)
{
cout << *p; // *p 是 3,意即: p 指向 v1
cout << *q; // *q 也是 3,意即: q 也指向 v1
q = &v2;
cout << *q; // *q 變成 5,因為: q 指向 v2
cout << *p; // *p 仍是 3,因為: p 仍指向 v1
}
和①相似的例子,p 指向 v1,在傳入函式 foo 時,建立了一個
複本 q,q 也指向 v1。但 q 只是 foo 內部的區域變數,改變
q 並不會影響外界的變數 p。所以說,在函式間傳遞指標,它的
本質仍然是 pass by value,只是這「value」指的是指標本身,
被複製的也是指標本身,而不是它所指的變數。
--
※ 發信站: 批踢踢實業坊(ptt.cc)