二维数组的C指针

问题描述 投票:0回答:1

在我的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));
c pointers
1个回答
1
投票

在表达式中使用的数组代号,例如作为初始化器,会被隐式转换为指向第一个元素的指针。

所以如果你有一个数组,比如

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].

© www.soinside.com 2019 - 2024. All rights reserved.