C 指向二维数组的指针

C pointer to 2D arrays

贯穿我的 C 代码。忽略容易混淆的标识符名称。原因是在 ptr61 指针的赋值中我必须​​放置地址 (&) 运算符,而在 ptr62 指针的赋值中 & 是不必要的。

int var6[3][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

int (*ptr61)[][4];
ptr61 = &var6;
printf("lvl 9: %d\n", (*ptr61)[2][0]);

int (*ptr62)[4];
ptr62 = var6;
printf("lvl 9: %d\n",*(*(ptr62 + 1)+2));

在表达式中使用的数组指示符(例如作为初始值设定项)隐式转换为指向其第一个元素的指针。

所以如果你有这样的数组

int var6[3][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

那么这个声明声明了一个包含 3 个类型 int[4] 元素的数组。因此,指向数组元素的指针将具有 int ( * )[4] 类型,您可以编写

int (*ptr62)[4] = var6;

如果你会写

ptr62 = &var6;

你会得到一个编译器错误,因为在赋值的左边有一个类型为 int( * )[4] 的对象,而在右边有一个类型为 int( * )[3][4] 的对象并且这些类型不兼容,并且没有从一种类型到另一种类型的隐式转换。

如果你想声明一个指向具有类型 int[3][4] 的整个数组的指针,那么这样的指针将具有类型 int ( * )[3][4] 并且你可以写

int (*ptr61)[3][4] = &var6;

至于这个声明

int (*ptr61)[][4] = &var6;

然后它声明了一个指向不完整数组类型的指针int[][4]