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)

回應第一篇迴響

>>>但卻也不是去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的機會。
 
arrow
arrow
    全站熱搜

    grant823 發表在 痞客邦 留言(1) 人氣()