2011-04-05 103 views
6

根據我的書,當您創建多維數組char a[10][10]時,它說您必須使用類似於char a[][10]的參數將數組傳遞給函數。多維數組和指向指針的指針

爲什麼你必須指定長度?你是不是隻是傳遞一個雙指針來處理,而不是雙指針已經指向分配的內存?那麼爲什麼參數不能是char **a?你通過提供第二10

回答

12

指針不是數組

甲重新分配任何新的存儲器解除引用的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]不兼容的類型,所以參數的類型(腐爛陣列)必須的參數(在函數原型的類型)

+0

您給出的解釋非常清楚,謝謝:-)。 – rubixibuc 2011-04-05 21:23:43

+0

此外,你提供的鏈接是真棒。 – rubixibuc 2011-04-05 21:31:42

+0

不客氣。很高興你喜歡c-faq。不要只讀第6節:閱讀[所有](http://c-faq.com/index.html)。 – pmg 2011-04-05 21:32:54

1

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]相同。

+0

謝謝你張貼,它也幫助我。 :-) – rubixibuc 2011-04-05 21:24:24