[問題] 指標陣列 傳遞問題?想了超久

看板C_and_CPP作者 (改名Dirk_AI56)時間8年前 (2016/02/19 23:05), 8年前編輯推噓4(4016)
留言20則, 7人參與, 最新討論串1/1
void getMem(char *ptr) { *ptr = (char*)malloc(200); } main() { char *str = NULL; getMem(&str); strcpy(str, "Hello C/C++ programming"); printf("%s\n", str); } 我試過void getMem(char **ptr) 改成兩個星號才會過 不懂為什麼?? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.121.31.79 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1455894311.A.A00.html

02/19 23:11, , 1F
置底十三誡的第十三?
02/19 23:11, 1F
您好, 我剛看完了 可是他最後問我想想&str會傳甚麼給副程式? 位址吧? 那為什麼用兩顆星號**ptr接 就可以呢? 我不太懂用副程式 **ptr 是甚麼意思...... ※ 編輯: kai5566 (122.121.31.79), 02/19/2016 23:29:58

02/19 23:28, , 2F
str的型態...
02/19 23:28, 2F

02/19 23:30, , 3F
不好意思 我覺得我很弱 可以麻煩多解釋一些嗎?
02/19 23:30, 3F

02/19 23:33, , 4F
你main裡的str是char*
02/19 23:33, 4F

02/19 23:34, , 5F
&str 就是char**
02/19 23:34, 5F
感謝你!!! 這樣我知道為什麼副程式用 **ptr了 但有個新問題 為何&str 是 char** ??? 我讀了很多指標資料沒有提到這個... 不知道大哥願不願意幫忙解釋,或有相關資料給我閱讀嗎?

02/19 23:45, , 6F
*ptr 是指 ptr這個位址指向的目標
02/19 23:45, 6F

02/19 23:46, , 7F
&str 是指 指向str這個變數的位址
02/19 23:46, 7F
嗯嗯 這個我知道~~~~ 那為什麼您說&str是 char**呢? ※ 編輯: kai5566 (122.121.31.79), 02/19/2016 23:47:52

02/19 23:49, , 8F
所以原本你的str是char* 是指向一個char的指標
02/19 23:49, 8F

02/19 23:50, , 9F
你再取&str 就是 指向一個(char*)的指標
02/19 23:50, 9F

02/19 23:56, , 10F
我想一下......我讀指標的書怎麼都沒講到這些= =
02/19 23:56, 10F

02/20 01:08, , 11F
關鍵字"雙重指標"
02/20 01:08, 11F

02/20 03:40, , 12F
把char*看成T的話,&str就是T*,會不會比較好懂XD
02/20 03:40, 12F

02/20 05:20, , 13F
字串型態宣告通常為char str_name[], 所以可以知道
02/20 05:20, 13F

02/20 05:20, , 14F
為字元陣列.陣列名稱本身就是第一個元素的記憶體位
02/20 05:20, 14F

02/20 05:20, , 15F
址,又&str_name為取記憶體位址,所以需要表示成char*
02/20 05:20, 15F

02/20 05:20, , 16F
*,也可以是char*[陣列大小].但是其實現再只有一個字
02/20 05:20, 16F

02/20 05:20, , 17F
串,而不是字串陣列(多個字串),所以&str_name還是指
02/20 05:20, 17F

02/20 05:20, , 18F
第一個字元的記憶體位址.如果為多個字串,則指第一
02/20 05:20, 18F

02/20 05:21, , 19F
個字串的第一個字元記憶體位址
02/20 05:21, 19F
感謝crazy大大、感謝overhead提供關鍵字 感謝froze哥以及感謝熱心的fight大!!!這題我了解了 再來仔細複習一下~thxxxx ※ 編輯: kai5566 (122.121.31.79), 02/20/2016 09:30:48

02/20 16:29, , 20F
指標大魔王
02/20 16:29, 20F
文章代碼(AID): #1Mnoyde0 (C_and_CPP)