c -二维数组地址和指向第一个元素的指针



对于一维数组,其数组名也是第一个元素的地址。所以可以把它赋值给一个指针,如下所示:

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]类型不同,即不兼容类型

最新更新