根據我的書,當您創建多維數組char a[10][10]
時,它說您必須使用類似於char a[][10]
的參數將數組傳遞給函數。多維數組和指向指針的指針
爲什麼你必須指定長度?你是不是隻是傳遞一個雙指針來處理,而不是雙指針已經指向分配的內存?那麼爲什麼參數不能是char **a
?你通過提供第二10
根據我的書,當您創建多維數組char a[10][10]
時,它說您必須使用類似於char a[][10]
的參數將數組傳遞給函數。多維數組和指向指針的指針
爲什麼你必須指定長度?你是不是隻是傳遞一個雙指針來處理,而不是雙指針已經指向分配的內存?那麼爲什麼參數不能是char **a
?你通過提供第二10
指針不是數組
甲重新分配任何新的存儲器解除引用的char **
是char *
類型的對象。
取消引用char (*)[10]
是char [10]
類型的對象。
數組不是指針
見c-faq entry about this very subject。
假設你有
char **pp;
char (*pa)[10];
,併爲參數的緣故,都指向同一個地方:0x420000。
pp == 0x420000; /* true */
(pp + 1) == 0x420000 + sizeof(char*); /* true */
pa == 0x420000; /* true */
(pa + 1) == 0x420000 + sizeof(char[10]); /* true */
(pp + 1) != (pa + 1) /* true (very very likely true) */
,這就是爲什麼參數不能char**
類型。還char**
和char (*)[10]
不兼容的類型,所以參數的類型(腐爛陣列)必須的參數(在函數原型的類型)
C語言標準,草案n1256匹配:
6.3。 2.1左值,數組和功能指示器
...
3除了當它是sizeof
操作者或一元&
操作者的操作數,或者是 字符串文字用於初始化一個數組,具有鍵入一個表達式「」數組 類型''爲 轉換爲類型爲''指針的表達式爲 類型''指向數組對象的初始元素 並且不是左值。如果數組對象具有寄存器存儲類,則行爲不確定。
鑑於
char a[10][10];
聲明陣列表達a
的類型是「的char
10元件陣列的10個元素的數組」。根據上面的規則,這被轉換爲鍵入「指向10個元素的數組char
」,或char (*)[10]
。
請記住,在函數參數聲明的上下文中,T a[N]
和T a[]
與T *a
相同;因此,T a[][10]
與T (*a)[10]
相同。
謝謝你張貼,它也幫助我。 :-) – rubixibuc 2011-04-05 21:24:24
您給出的解釋非常清楚,謝謝:-)。 – rubixibuc 2011-04-05 21:23:43
此外,你提供的鏈接是真棒。 – rubixibuc 2011-04-05 21:31:42
不客氣。很高興你喜歡c-faq。不要只讀第6節:閱讀[所有](http://c-faq.com/index.html)。 – pmg 2011-04-05 21:32:54