当您创建多维数组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 条目。
假设你有
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]
不是兼容的类型,所以参数的类型(衰减的数组)必须匹配参数(函数原型中的类型)
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]
。