[問題] void* and void**

看板C_and_CPP (C/C++)作者 (新竹屌炸天)時間12年前 (2013/11/01 01:04), 編輯推噓1(105)
留言6則, 5人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) stdlib 問題(Question): 在網路上看到了一個動態宣告二維陣列的方式 大致上已經了解在做甚麼 不過無法理解的是明明a是一個void** 可是function的return type卻是void* 我的想法是void*可以是指向任何型態的指標,所以應該也包括指向指標的指標 不過這樣想的話所有的void**都應該可以用void*來取代阿 不過實際上如果把綠色的部分都改成void* compile不會過 把紅色的改成void**的話compiler會過,但是會出現warning 請問為什麼a是void**,function的return type卻是void*呢? 程式碼(Code):(請善用置底文網頁, 記得排版) void* malloc2Darray(int h,int w,int size) { int i; void** a = (void**) malloc ( h*sizeof(void*) + h*w*size ) for(i=0;i<h;i++) a[i] = ((char*)(a+h)) + i*w*size; return a; } 補充說明(Supplement): -- ────╮ ╮ ╮╭──┬╭─┬─╯┬── ──╮ ╭╯ │ ││ │ 幹!考試讀不完! /\ <●╰────┼──┤├──┤ ├─★黑特嗎? φ /> │ ││ │ │ ╭───╮ /| ╰ ╰╯ ╰ ╰──╯ ╭╯ ﹀\﹀ 臣亮言:先帝創業未半,而中道崩殂。今天下... ξwinken2004╰────────/\─╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.249.170

11/01 01:11, , 1F
我覺得是回傳型態寫錯了...這個回傳型態應該要是 void**
11/01 01:11, 1F

11/01 08:10, , 2F
同樓上。原po指標觀念仍不夠清楚,試試畫圖
11/01 08:10, 2F

11/01 11:11, , 3F
另外void*可以吃大部分的指標,包括void**
11/01 11:11, 3F
在網路上看了幾個資料 回傳型態確實是void* http://ppt.cc/QL-_ 我後來把後面的所有評論大致瀏覽過後 大概可以理解為啥是void* 其實跟我想得差不多,void*可以是指向任何型態的指標 所以也包括指向指標的指標 至於為啥void**會出現warming,可能是寫compiler的人不希望我們這樣寫吧? 我在猜compiler可能希望function回傳不知道指向甚麼型態的指標的時候 都固定回傳void*,而不是void**或是void***之類的 反正到時候再用cast轉換成(int **)或是(char **)之類的就可以了 我還沒修到compiler就是了... 後來用不同的compiler,return type用void**結果也沒出現warning XD 而且我自己觀察就算有warning程式也可以正確地跑就是了... 雖然不知道會不會哪天爆炸XD 至於把綠色的部分改成void* 應該只是我癡心妄想而已吧XD 有一點把compiler想像成無所不能的東西了 只是抱持著好奇好玩的心情這樣改的 就算可以過我也不敢這樣用XD ※ 編輯: winken2004 來自: 140.113.249.170 (11/01 16:34)

11/01 16:45, , 4F
綠色部分是肯定不能這樣做的. a[i] 的型態會是 void
11/01 16:45, 4F

11/01 16:46, , 5F
何況 void * 是不能做指標的算術運算的 (+, -)
11/01 16:46, 5F

11/01 21:17, , 6F
warning
11/01 21:17, 6F
阿 感謝XD ※ 編輯: winken2004 來自: 140.113.249.170 (11/01 22:15)
文章代碼(AID): #1ISesrPl (C_and_CPP)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
文章代碼(AID): #1ISesrPl (C_and_CPP)