看板 C_and_CPP 關於我們 聯絡資訊
課本範例: For call by addr. void f(int *a) { *a=10; } void main() { int b=5; f(&b); //把b記憶體位址,傳入f } 不能拿以下例子去判斷變數傳遞方式是不是call by addr. or value吧? void f(int *a) { a=new int (10); } void main() { int b=5; f(&b); } 存取的變數根本就不一樣了 (上面是存取addr point到的變數,下面是存取pointer) -- 我的露天拍賣: http://tinyurl.com/6z4rw7 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.126.177 ※ 編輯: walm20 來自: 140.118.126.177 (02/19 11:54) ※ 編輯: walm20 來自: 140.118.126.177 (02/19 11:58)
windincloud:我覺得你第二個例子這樣兩者都不算才對~ 02/19 13:15
windincloud:call by val. addr.應該是要成立在傳入副函式且不改其 02/19 13:16
windincloud:值的使用, 你這樣寫 反而是新開空間給a了~ b有傳沒傳 02/19 13:17
windincloud:都一樣~ :p 02/19 13:17
walm20:你這樣講 是假設你在main裡面想改的是b的值 02/19 13:28
walm20:若我想改b的位址 那就是call by value 02/19 13:28
※ 編輯: walm20 來自: 140.118.126.177 (02/19 13:30)
VictorTom:Call by xxx是看參數的傳遞方式, 不是看參數怎麼做存取. 02/19 14:00
VictorTom:而且您的第二個例子只會造成mem leak沒有其他作用@_@" 02/19 14:02
VictorTom:它不會改變b, 也跟參數call by xxx沒什麼直接的關係. 02/19 14:03
walm20:我以為大家焦點只會在call by xxx,所以就不寫delete 02/19 14:09
VictorTom:重點不是delete, 而是第二個例子變成和b完全沒有關係. 02/19 14:11
walm20:那您的意思應該是說 市面上有寫到call by addr的書是錯的 02/19 14:11
walm20:應該改為call by value摟? 02/19 14:11
VictorTom:傳了b的address進來沒有使用, 這沒解釋param passing @@ 02/19 14:12
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我是覺得這句話跟以下例子矛盾 (即CBV) void f(int a) { a=10; } void main() { int b=5; f(a); } 個人淺見 :p
VictorTom:很吊詭的是CbA這種講法我現在看到兩種對立的解釋.... 02/19 14:13
VictorTom:一種是C語言老式的"pass the address by value"的作法 02/19 14:14
VictorTom:一種就是說Call by Reference是Call by Address.... 02/19 14:15
VictorTom:在原文的資料裡目前小弟找不到具體講Call by Address的. 02/19 14:15
VictorTom:所以個人覺得搞清楚CbV, CbR, 而by Address盡量不要講. 02/19 14:15
VictorTom:或者如果板上有先進有更明確的資料能提供的願聞其詳:) 02/19 14:16
※ 編輯: walm20 來自: 140.118.126.177 (02/19 14:23) ※ 編輯: walm20 來自: 140.118.126.177 (02/19 14:25)