6

当您创建多维数组char a[10][10]时,根据我的书它说您必须使用类似于char a[][10]将数组传递给函数的参数。

为什么必须这样指定长度?您不只是将双指针传递给与,并且该双指针不是已经指向分配的内存吗?那么为什么参数不能是char **a?您是否通过提供第二个 10 来重新分配任何新内存。

4

2 回答 2

13

指针不是数组

取消引用char **是类型的对象char *

取消引用char (*)[10]是类型的对象char [10]

数组不是指针

请参阅有关此主题的 c-faq 条目


假设你有

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) */

这就是为什么参数不能是 type 的原因char**。而且char**char (*)[10]不是兼容的类型,所以参数的类型(衰减的数组)必须匹配参数(函数原型中的类型)

于 2011-04-05T21:06:50.350 回答
1

C 语言标准,草案n1256

6.3.2.1 左值、数组和函数指示符
...
3 除非它是运算sizeof符或一元&运算符的操作数,或者是用于初始化数组的字符串字面量,否则表达式类型为 ''array of type ' ' 被转换为类型为 ''pointer to type '' 的表达式,它指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。

鉴于声明

char a[10][10];

数组表达式的类型a是“10 元素数组的 10 元素数组char”。根据上面的规则,它被转换为类型“指向 10 元素数组的指针char”,或者char (*)[10].

请记住,在函数参数声明的上下文中,T a[N]T a[]等同于T *a; 因此,T a[][10]与 相同T (*a)[10]

于 2011-04-05T21:15:03.140 回答