2011-04-05 132 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