根据我的书,当您创建多维数组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