精華區beta C_and_CPP 關於我們 聯絡資訊
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)