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]
。
贯穿我的 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]
。