当您创建多维数组char a[10][10]
时,根据我的书,它说您必须使用类似于char a[][10]
的参数将数组传递给函数。
为什么必须指定这样的长度?你是不是只是将一个双指针传递给了,并且那个双指针是否已经指向已分配的内存?那么为什么参数不能是char **a
?您是否通过提供第二个10来重新分配任何新内存。
答案 0 :(得分:13)
指针不是数组
取消引用的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]
也不是兼容类型,因此参数类型(衰减数组)必须与参数(函数原型中的类型)匹配
答案 1 :(得分:1)
C语言标准,草案n1256:
6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof
运算符或一元&
运算符的操作数,或者是 用于初始化数组的字符串文字,类型为''数组 type ''的表达式是 转换为类型为''指向 type '的指针的表达式,指向的初始元素 数组对象并不是左值。如果数组对象有寄存器存储类,则 行为未定义。
声明
char a[10][10];
数组表达式a
的类型是“10个元素的char
数组的10个元素数组”。根据上面的规则,它会被转换为“指向char
的10个元素数组的指针”或char (*)[10]
。
请记住,在函数参数声明的上下文中,T a[N]
和T a[]
与T *a
相同;因此,T a[][10]
与T (*a)[10]
相同。