看板 C_and_CPP 關於我們 聯絡資訊
如果說 C/C++ 沒有 call-by-address, 只有 call-by-value, 個人覺得這樣未免太 cynical 了 @_@" 參數的傳遞模式應該是種抽像的概念, 而不是實際的實作方式. 摘一段 Concepts of Programming Languages, Robert W. Sebesta, 9.5.2.4 的 Pass-by-Reference 來說 (這裡的 reference 是概念上的 reference, 不是C++的reference) the pass-by-reference method transmits an access path, usually just an address, to the called subprogram. (傳參照的方法傳遞一個取存路徑, 通常就是一個位址, 給被呼叫端) This provides the access path to the cell storing the actual parameter. (這提供一個儲存真實參數的存取路徑) Thus the called subprogram is allowed to access the actual parameter (因此被呼叫的副程式可以取存真實參數) in the calling program unit. In effect, the actual parameter is shared with the called subprogram. (繞來繞去其實都在講同一個東西..||) -- 若要以實作方去說 C/C++ 只存在 call-by-value 的話, 那應該沒有語言可以達到所謂 call-by-reference了吧? 每個東西追根究底還是傳不是value過去.__.? 又或者是不是可以說, 根本就沒有 method 或 function 這種東西, 說穿了還不是 jump ? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.42.112 ※ 編輯: cole945 來自: 140.112.42.112 (06/21 22:44)
VictorTom:不知道是不是小弟的推文讓您誤解了什麼, 簡單回推一下. 06/21 22:56
VictorTom:C只有Call by Value, C++就多了Call by Reference.... 06/21 22:57
VictorTom:但是有些中文書, 把傳pointer像 swap(int *a, int*b); 06/21 22:58
VictorTom:這種東西叫Call by Address, 然後說C有CbA這種傳遞法. 06/21 22:58
VictorTom:大概是因為作者"覺得"現在是把var的address傳進去了. 06/21 22:59
VictorTom:但是他忽略了這其實是把pointer用CbV的方式傳入而已. 06/21 22:59
VictorTom:實際上的CbA其實就像您說的, 應該是指Call by Reference 06/21 23:00
VictorTom:搞到最後, Call by Address這種講法讓人很難分辨到底在 06/21 23:02
cole945:我的意思是,簡單講,C/C++的傳pointer*也好,傳ref&也好, 06/21 23:02
cole945:都應屬於Call-by-ref的一種. 因為傳遞方式是看概念/模式 06/21 23:02
cole945:而不是看實作.__. 06/21 23:02
VictorTom:說Pass by Value還是Pass by Reference....Orz 06/21 23:03
cole945:不然,就如前面zlw也提到的,ref其實也是用addr在實作呀._.a 06/21 23:03
cole945:call-by和pass-by是不同的東西嗎 囧a 是我弄混嗎囧? 06/21 23:04
VictorTom:一樣的啦, 只是推文的時候看到您引文的"pass...." 06/21 23:04
VictorTom:不小心打開了; 其實也有人說用pass by會比call by更清楚 06/21 23:05
VictorTom:傳pointer*算CbR!? 這個說法還真是第一次聽過Orz 06/21 23:09
cole945:其實那本concepts of programming language中CbR的範例 06/21 23:10
VictorTom:您這樣的說法等於認為C語言是有Call by Reference的~_~ 06/21 23:11
cole945:就是用void fun(int *first, int *second)舉例@.@ 06/21 23:11
cole945:我說有CbR的CbR不是C++的R,而是用參數的傳法來看,是有@.@" 06/21 23:12
stonehomelaa:你第一行是不是打錯了? call-by-address?? 06/21 23:12
VictorTom:好吧, 小弟得承認無論PL或C/C++prime這一類的書都讀的不 06/21 23:14
VictorTom:怎樣, 看來小弟的觀念也還需要再學習一下....<(_ _)> 06/21 23:16
cole945:樓上有推薦單講程語,除了我提到的concepts的那本外書嗎._. 06/21 23:16
VictorTom:其實我也不記得以前老師用哪本書了Orz 06/21 23:19
VictorTom:C/C++的經典書大家推很多, 不知道PL的書有沒有@_@" 06/21 23:19
cole945:我剛發現 PLT 版 "請問call by address" 有 "C只有call-by 06/21 23:54
cole945:value"的說明 @o@" 06/21 23:54
VictorTom:是啊, 傳l-Value還是傳r-Value的記憶又回來了....:) 06/22 00:23
UNARYvvv:其實我看 VictorTom 的推文覺得沒有不妥@@ 06/22 16:47
UNARYvvv:C 那種透過傳遞指標讓函式內部能改到外界參數充其量是在 06/22 16:48
UNARYvvv:模擬 call by ref, 但在 C 語言的層次上那個指標變數就是 06/22 16:49
UNARYvvv:某個位址 value 而已, C++ 的話才在語言本身支援 byRef 06/22 16:51
zlw:Sebesta那本書說的pass by ref有說,不會有額外的空間來存放 06/22 16:55
zlw:我想他的意思是,記憶體放到eax去,沒有push。而這by name原本 06/22 16:56
zlw:是講用額外空間存放內容,但C有指標,內容是一個記憶體位址。 06/22 16:56
zlw:這使傳指標既像by name又像by ref,感覺就是兩者本來就非空集 06/22 16:57
UNARYvvv:by name 還是 by value ?? 06/22 17:04
zlw:抱歉,我打錯 06/22 17:05