[心得] 關於 C 語言的傳址呼叫

看板C_and_CPP作者 (不再寫詩的詩人)時間15年前 (2010/09/09 11:03), 編輯推噓9(9045)
留言54則, 12人參與, 最新討論串1/1
小弟在剛開始寫資料結構的時候 曾經苦思不得其解, C 語言不是有傳址呼叫嗎 傳址呼叫不就是傳遞指標變數嗎 為什麼明明我以指標變數當參數 仍是無法建立資料結構呢? 可參考已下網頁的程式(錯誤範例) http://pydoing.blogspot.com/2010/09/c-ch0606.html 後來研讀、思索,發現 C 語言有傳遞指標的指標 也就是雙重指標,用傳值呼叫來理解雙重指標 突然一切就豁然開朗 因此將這些寫入規劃的 C 語言初學教材中 http://pydoing.blogspot.com/2010/09/c-ch0611.html 希望對於學習 C 語言的人能有所幫助 小弟規劃的 C 語言教材有 C 語言快速導覽 http://pydoing.blogspot.com/2010/06/c-overview.html C 語言標準函數庫分類導覽 http://pydoing.blogspot.com/2010/07/c-std.html C 語言初學教材 http://pydoing.blogspot.com/2010/07/c-ch0000.html 或可見 C 語言教材完整目錄 http://pydoing.blogspot.com/p/c-tutorial.html 其中, C 語言初學教材為帶領讀者開發通訊錄程式為目標 每一章逐步使讀者掌握並了解如何設計、開發軟體 歡迎舊雨新知,蒞臨指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.141.93

09/09 11:13, , 1F
所以盡量不要以"傳址呼叫"來理解..C就只有call by value
09/09 11:13, 1F

09/09 11:17, , 2F
沒有call by address 不要被仿間的東西騙啦~
09/09 11:17, 2F

09/09 11:17, , 3F
09/09 11:17, 3F

09/09 11:17, , 4F
我同一樓XD 每次都跟身邊的人說 C 只有 call by value
09/09 11:17, 4F

09/09 11:18, , 5F
只差那個value 是內容值還是位址的值而已
09/09 11:18, 5F

09/09 11:18, , 6F
感覺越來越多人接受 call by address 的說法了 (積非成是?)
09/09 11:18, 6F

09/09 11:24, , 7F
話說那篇FAQ要改一下了 有了R-value ref...XD
09/09 11:24, 7F

09/09 11:51, , 8F
幾年前我大學教授就用call by address一詞在授課...
09/09 11:51, 8F

09/09 11:57, , 9F
C沒有call by address一詞 那C++有嗎 (當然他指的機制是都有)
09/09 11:57, 9F

09/09 11:57, , 10F
我想問的是"by address"這個名詞本身
09/09 11:57, 10F

09/09 13:12, , 11F
我們compiler教授也會這樣說..其實我覺得應該說
09/09 13:12, 11F

09/09 13:13, , 12F
用pass address的方式模擬call by reference
09/09 13:13, 12F

09/09 22:23, , 13F
好多仿間的東西,可是又不知道哪些是真的...。
09/09 22:23, 13F

09/09 22:24, , 14F
坦白說我覺得程式寫得出來寫得好才是真的......... (逃)
09/09 22:24, 14F

09/09 23:27, , 15F
我們教授以前講到這件事時小弟也才晃然大誤, 用力的把
09/09 23:27, 15F

09/09 23:27, , 16F
把傳pointer當作傳址的這種錯誤觀念用力的捨棄....Orz
09/09 23:27, 16F

09/10 08:56, , 17F
樓上的教授真糟糕!! 居然讓學生晃然大"誤" (逃)
09/10 08:56, 17F

09/10 23:43, , 18F
XDDD 悟, ㄅ半選字數字太接近就typo了....XDDD
09/10 23:43, 18F

09/11 00:08, , 19F
驚!樓上跟我一樣是ㄅ半使用者XD
09/11 00:08, 19F

09/11 00:50, , 20F
沒辦法, 小弟我受不了那種搞不懂新注音到底能不能在這一
09/11 00:50, 20F

09/11 00:51, , 21F
句裡把所有詞都辨認正確的fu, 除非你改過, 不然有時候它
09/11 00:51, 21F

09/11 00:51, , 22F
傻傻的變來變去, 看了就煩, 不如自己選, 常用字手指會自
09/11 00:51, 22F

09/11 00:51, , 23F
己記起來要按什麼XDDD
09/11 00:51, 23F

09/11 01:14, , 24F
有用喔 謝啦
09/11 01:14, 24F

09/11 11:25, , 25F
我覺得那是為了教學的原因,必須要把某些東西抽像化,
09/11 11:25, 25F

09/11 11:26, , 26F
但在實作上,它的確是沒有call by address的,但若沒
09/11 11:26, 26F

09/11 11:27, , 27F
有這樣的抽像觀念,你跟初學者講指標和數值都是傳值,
09/11 11:27, 27F

09/11 11:27, , 28F
他們可能會發瘋吧!
09/11 11:27, 28F

09/11 14:48, , 29F
小弟我到覺得, 這邊如果要用傳址攪和在一起, 那才是真正
09/11 14:48, 29F

09/11 14:49, , 30F
沒有好好理解指標的概念@_@" 指標變數也是變數, 只是記
09/11 14:49, 30F

09/11 14:49, , 31F
錄的是記憶體位址, 就像int變數記整數, float記浮點數差
09/11 14:49, 31F

09/11 14:50, , 32F
不多, 事實上抽象化來看它更是by value而不是by addr.
09/11 14:50, 32F

09/11 22:24, , 33F
釐清初學者什麼是 value ,這個概念會很重要
09/11 22:24, 33F

09/11 22:24, , 34F
如果開始就導引初學者一個似是而非的觀念
09/11 22:24, 34F

09/11 22:24, , 35F
對初學者往後的學習很容易產生不良的影響
09/11 22:24, 35F

09/11 22:25, , 36F
小弟的文中指出
09/11 22:25, 36F

09/11 22:25, , 37F
所謂的傳址呼叫僅適用於取址運算子 & 的情形
09/11 22:25, 37F

09/11 22:25, , 38F
而非所有的指標變數,問題是指標不就代表位址嗎
09/11 22:25, 38F

09/11 22:26, , 39F
因此這樣容易造成學習者混淆
09/11 22:26, 39F

09/11 22:26, , 40F
站在教學立場就應該解釋清楚
09/11 22:26, 40F

09/11 23:55, , 41F
傳址呼叫事實上也是傳一個pointer進去不是嗎?
09/11 23:55, 41F

09/12 00:47, , 42F
byVal與byRef(Addr)主要的差異在, 傳遞的是arguments
09/12 00:47, 42F

09/12 00:48, , 43F
(引數)的value, 還是address....
09/12 00:48, 43F

09/12 00:49, , 44F
func(int *p){} 然後main(){int i; func(&i);}時,
09/12 00:49, 44F

09/12 00:50, , 45F
傳入func的argu是expression (&i)的value, 雖然你用中
09/12 00:50, 45F

09/12 00:50, , 46F
文理解的話是i的address被傳入了, 可是就語言的觀點來
09/12 00:50, 46F

09/12 00:50, , 47F
看, 被傳入的是&i的運算結果, 所以說是(&i)的value.
09/12 00:50, 47F

09/12 00:51, , 48F
func(int &r){} 然後main(){int i; func(i);}時,
09/12 00:51, 48F

09/12 00:53, , 49F
傳入func的argu是i的參考(ref), 像是和i一樣的東西,
09/12 00:53, 49F

09/12 00:54, , 50F
只是底層實作可能是把i的address pass給func;
09/12 00:54, 50F

09/12 00:55, , 51F
這兩種差異也決定了想在func裡讀寫原本在main的i變數的
09/12 00:55, 51F

09/12 00:55, , 52F
資料時, coding的寫法有沒有需要多一個dereference (*p)
09/12 00:55, 52F

09/12 00:56, , 53F
的動作. 小弟的認知如此, 有漏誤或其他更多細節, 就有
09/12 00:56, 53F

09/12 00:56, , 54F
待板上其他強者大大們指正補充了....<(_ _)>
09/12 00:56, 54F
文章代碼(AID): #1CY4vy3d (C_and_CPP)