close
About C:
紀錄一下學到的東西,
或許只是短短的3行,
但卻是常讓人搞混的概念。
C沒有Call-By-Reference,
那個只是Simulating Call-By-Reference,
C只有Call-By-Value。
覺得太多人在看這篇了,
有必要依我的了解,
去詳加解釋這中間微妙的關係。
void function_a(int * a)
{
a += 1;
}
void function_b(int &b)
{
&b += 1;
}
void funtcion_c(int c)
{
c += 1;
}
int main()
{
return 0;
}
把這程式丟入C compiler沒意外的話他會給個error,
問題出在function_b,
也就是C所沒有的東西(Call-By-Reference ),
可能會有人疑惑那function_a(int * a)是什麼?
他就是所謂的Simulating Call-By-Reference,
其實他做的事情就是funtion_c((int)&data),
也就是對address做Call-By-Value.
P.S.如果覺得我說的不夠清楚的話,可以留言討論。reference = address(Synonyms)
問題出在function_b,
也就是C所沒有的東西(Call-By-Reference ),
可能會有人疑惑那function_a(int * a)是什麼?
他就是所謂的Simulating Call-By-Reference,
其實他做的事情就是funtion_c((int)&data),
也就是對address做Call-By-Value.
P.S.如果覺得我說的不夠清楚的話,可以留言討論。reference = address(Synonyms)
回應第一篇迴響
>>>但卻也不是去simulate call by reference. 打從Standard C開始...就是沒有by reference的觀念 <<<
這點我完全認同,
因為C只有Call-By-Value,
或許用是我simulate這個詞或許不太恰當。
我想之所以會有function_a(int * a)這部分,是為了改善,
C語言在對largest Struct作call by value
會有極大的缺陷,
所延伸出來的一個另一套解決方案,
表面看起來很像Call-By-Reference,
但是骨子裡還是 Call-By-Value。
在C語言之父Dennis Ritchie寫的The C Programming
Language之中,
Chapter 1.8 - Arguments Call by
Value,
一開始就有提到One aspect of C functions ...
如果我沒記錯"整本書"中並沒有提到(Call by point/address)這個詞。
(我書借給學弟我就畢業了,現在還沒拿回來,所以暫時無法考證)
不過管他是Call by Value/Address/Point,
其實也只是個說法,
最找要的還是要知道他是怎麼運作的,
才可以減少在程式中遇到error的機會。
全站熱搜
留言列表