多维数组和指向指针的指针

6
当你创建多维数组char a[10][10]时,根据我的书籍,它说你必须使用类似于char a[][10]的参数将数组传递给函数。
为什么必须这样指定长度?难道你不是一开始就传递了一个双指针吗?那个双指针难道不已经指向了分配好的内存吗?那么为什么参数不能是char **a?你通过提供第二个10来重新分配任何新的内存吗?
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) */

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


你提供的链接太棒了。 - rubixibuc
不用谢,很高兴您喜欢C-FAQ。不要只阅读第6部分:全部都要读 - pmg

1

C语言标准,草案n1256

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

给定一个声明:

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]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接