多维数组和指针指针

时间:2011-04-05 20:53:48

标签: c arrays pointers pointer-to-pointer

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

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

2 个答案:

答案 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]相同。