作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题[FAQ集] 函式:pass by value/address/reference
时间Thu Sep 1 23:54:17 2005
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;
}
-----------------------------------
敬请指正错误,或提出更合适的答案。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.167
1F:推 renderer:推 61.228.216.206 09/01
※ 编辑: khoguan 来自: 220.130.208.167 (09/02 00:02)