看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) macOS 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 我想請問一下丟&A 然後用A**去接是什麼意思? 另外我測試了**A *A A 去接 然後印出 *A **A的值都會一樣 讓我更困惑了 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): console: 10 20 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> void fun(int **A){ printf("%d\n",*A); printf("%d\n",**A); } int mian(){ int a = 10; int *A = &a; fun(&A); } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.123.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1498532665.A.05B.html
TWkobe: 假設a的地址是0x100,值為10 , pointerA的地址為0x200, 值 06/27 11:08
TWkobe: 為0x100 06/27 11:09
TWkobe: 你把&A餵進去就是把0x200丟進去 06/27 11:10
ptt0720: 那用什麼東西接有差嗎 用**A *A A 06/27 11:26
TWkobe: 你可以想像**A要跑兩次所以丟0x200進去後, 他會先依照0x20 06/27 11:27
TWkobe: 0找出值0x100, 再依0x100尋找得到值10, 所以丟&A後**A為10 06/27 11:28
TWkobe: 而丟&A使用*A就只有跑一次, 所以印出0x100 06/27 11:29
ptt0720: 感謝 06/27 11:31
freeunixer: 你是看什麼書寫的範例?這個 code 形參、實參用得不好 06/27 11:35
TWkobe: 若你只是print出A , 是顯示你餵進來的pointer所儲存的內容 06/27 11:35
TWkobe: 所以依照你的範例結果為0x200 06/27 11:35
freeunixer: 你最好不要將 main 跟 fun 的變數寫一樣,才好看出差別 06/27 11:36
freeunixer: 你的問題是沒搞清楚為什麼 main 傳 &A 進 fun(), 06/27 11:37
freeunixer: 但 fun 卻是收 (**A)...事實上,兩個 A 是不同的. 06/27 11:37
freeunixer: 將 fun 的 A 全改成 B,會比較好區分,也比較容易搞清楚 06/27 11:39
alex70266: 其實記住C只有call by value就是了 06/29 23:44
alex70266: 阿阿怎麼會推文到這來XDDDDD 搞笑orz 06/29 23:48
zakk0610: 當你的func要改pointer的值(*p的p)時會傳**p,傳*p無法改 08/02 07:29
zakk0610: p的值 08/02 07:29
zakk0610: 精確來講可以改值但只改到local variable 08/02 07:30