对于一维数组,其数组名也是第一个元素的地址。所以可以把它赋值给一个指针,如下所示:
char data[5];
char* p_data=data;
所以我认为对于二维数组也是一样的。数组名应该是第一个元素的地址。所以,我想这样做:
char data[5][5];
char** pp_data=data;
然后我得到一个警告,说指针类型char**
与char[ ][ ]
不兼容。
为什么会发生这种情况?我理解指针和数组的概念错误吗?
你说得对,数组通常由指向其第一个元素的指针来引用。但是当你有二维数组
char data[5][5];
实际上是一个数组的数组。数组data
的第一个元素是一个5个字符的数组。所以这段代码可以工作:
char (*pa_data)[5] = data;
这里pa_data
是指向数组的指针。编译器不会抱怨它,但它可能对你有用,也可能对你没用。
确实,像char **pp_data
这样的指针对指针可以像二维数组一样工作,但是你必须为它做一些内存分配。事实证明,在数组的数组char data[5][5]
中没有指向char
的指针,pp_data
是指向的指针。(特别是,您可以而不是表示类似pp_data = &data[0][0]
的内容。)
请参阅C常见问题列表中的此问题
二维数组实际上是数组的数组。这意味着数组的第一个元素是一个数组。因此,二维数组将被转换为指向数组(其第一个元素)的指针。
char data[5][5];
在表达式中使用时,除了一些例外,data
将被转换为指向其第一个元素data[0]
的指针。data[0]
是char
的一个数组。因此,data
的类型将变成指向5个数组的指针char
,即char (*)[5]
。
char **
和char (*)[5]
类型不同,即不兼容类型