作者ptt0720 (濕濕)
看板C_and_CPP
標題[問題] c語言雙重pointer問題
時間Tue Jun 27 11:04:21 2017
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1498532665.A.05B.html
1F:推 TWkobe: 假設a的地址是0x100,值為10 , pointerA的地址為0x200, 值 06/27 11:08
2F:→ TWkobe: 為0x100 06/27 11:09
3F:→ TWkobe: 你把&A餵進去就是把0x200丟進去 06/27 11:10
4F:→ ptt0720: 那用什麼東西接有差嗎 用**A *A A 06/27 11:26
5F:推 TWkobe: 你可以想像**A要跑兩次所以丟0x200進去後, 他會先依照0x20 06/27 11:27
6F:→ TWkobe: 0找出值0x100, 再依0x100尋找得到值10, 所以丟&A後**A為10 06/27 11:28
7F:→ TWkobe: 而丟&A使用*A就只有跑一次, 所以印出0x100 06/27 11:29
8F:→ ptt0720: 感謝 06/27 11:31
9F:→ freeunixer: 你是看什麼書寫的範例?這個 code 形參、實參用得不好 06/27 11:35
10F:推 TWkobe: 若你只是print出A , 是顯示你餵進來的pointer所儲存的內容 06/27 11:35
11F:→ TWkobe: 所以依照你的範例結果為0x200 06/27 11:35
12F:→ freeunixer: 你最好不要將 main 跟 fun 的變數寫一樣,才好看出差別 06/27 11:36
13F:→ freeunixer: 你的問題是沒搞清楚為什麼 main 傳 &A 進 fun(), 06/27 11:37
14F:→ freeunixer: 但 fun 卻是收 (**A)...事實上,兩個 A 是不同的. 06/27 11:37
15F:→ freeunixer: 將 fun 的 A 全改成 B,會比較好區分,也比較容易搞清楚 06/27 11:39
16F:→ alex70266: 其實記住C只有call by value就是了 06/29 23:44
17F:→ alex70266: 阿阿怎麼會推文到這來XDDDDD 搞笑orz 06/29 23:48
18F:→ zakk0610: 當你的func要改pointer的值(*p的p)時會傳**p,傳*p無法改 08/02 07:29
19F:→ zakk0610: p的值 08/02 07:29
20F:→ zakk0610: 精確來講可以改值但只改到local variable 08/02 07:30