在我的C代码中,忽略了混乱的标识符名称,原因是在分配ptr61指针时,我必须使用地址(&)运算符,而在分配ptr62指针时,&是不必要的。 原因是在分配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]
.