[問題] c語言雙重pointer問題

看板C_and_CPP (C/C++)作者 (濕濕)時間8年前 (2017/06/27 11:04), 編輯推噓3(3017)
留言20則, 5人參與, 最新討論串1/1
開發平台(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

06/27 11:08, , 1F
假設a的地址是0x100,值為10 , pointerA的地址為0x200, 值
06/27 11:08, 1F

06/27 11:09, , 2F
為0x100
06/27 11:09, 2F

06/27 11:10, , 3F
你把&A餵進去就是把0x200丟進去
06/27 11:10, 3F

06/27 11:26, , 4F
那用什麼東西接有差嗎 用**A *A A
06/27 11:26, 4F

06/27 11:27, , 5F
你可以想像**A要跑兩次所以丟0x200進去後, 他會先依照0x20
06/27 11:27, 5F

06/27 11:28, , 6F
0找出值0x100, 再依0x100尋找得到值10, 所以丟&A後**A為10
06/27 11:28, 6F

06/27 11:29, , 7F
而丟&A使用*A就只有跑一次, 所以印出0x100
06/27 11:29, 7F

06/27 11:31, , 8F
感謝
06/27 11:31, 8F

06/27 11:35, , 9F
你是看什麼書寫的範例?這個 code 形參、實參用得不好
06/27 11:35, 9F

06/27 11:35, , 10F
若你只是print出A , 是顯示你餵進來的pointer所儲存的內容
06/27 11:35, 10F

06/27 11:35, , 11F
所以依照你的範例結果為0x200
06/27 11:35, 11F

06/27 11:36, , 12F
你最好不要將 main 跟 fun 的變數寫一樣,才好看出差別
06/27 11:36, 12F

06/27 11:37, , 13F
你的問題是沒搞清楚為什麼 main 傳 &A 進 fun(),
06/27 11:37, 13F

06/27 11:37, , 14F
但 fun 卻是收 (**A)...事實上,兩個 A 是不同的.
06/27 11:37, 14F

06/27 11:39, , 15F
將 fun 的 A 全改成 B,會比較好區分,也比較容易搞清楚
06/27 11:39, 15F

06/29 23:44, , 16F
其實記住C只有call by value就是了
06/29 23:44, 16F

06/29 23:48, , 17F
阿阿怎麼會推文到這來XDDDDD 搞笑orz
06/29 23:48, 17F

08/02 07:29, , 18F
當你的func要改pointer的值(*p的p)時會傳**p,傳*p無法改
08/02 07:29, 18F

08/02 07:29, , 19F
p的值
08/02 07:29, 19F

08/02 07:30, , 20F
精確來講可以改值但只改到local variable
08/02 07:30, 20F
文章代碼(AID): #1PKSiv1R (C_and_CPP)
文章代碼(AID): #1PKSiv1R (C_and_CPP)