我想知道是否可以在C:
中取消引用指向二维数组的指针int matrix1[2][2] = {{1,2},{3,4}};
int matrix2[2][2] = {{4,5},{6,7}};
我正在尝试创建一个指针数组,其中第一个指针指向matrix1,第二个指针指向matrix2。我想到了
int *(pt[2]);
pt[0] = &matrix1
我的目标是能够使用以下内容访问两个数组中的任何一个元素:
pt[0][n][m];
或者对于第二个矩阵:
pt[1][n][m]
但据我所知,这并不奏效。指针声明是错误的吗?
答案 0 :(得分:3)
答案 1 :(得分:0)
提供的答案是正确的,但缺乏解释。我认为如果你理解你的方法失败的原因会更有帮助。
在指针上使用数组索引的工作原理是使用数据类型的大小递增指针。
例如,如果我们按如下方式定义数组:
int a[2] = {1,2};
并假设该数组是在位置x
的内存中创建的a[0]; // points at x
a[1]; //points at x + sizeof(int)
现在让我们以二维数组
为例int a[2][2] = {{1,2},{3,4}}
再次假设位置x
a[0]; //points at x
a[1]; //points at x + sizeof(int [2]) because int[2] is the data type
a[0][1]; // points at x + sizeof(int)
a[1][1]; // points at x + sizeof(int[2]) + sizeof(int)
现在让我们举个例子
int matrix1[2][2] = {{1,2},{3,4}};
int matrix2[2][2] = {{4,5},{6,7}};
int *pt[2];
pt[0] = &matrix1; //doesn't compile
首先,这不会真正编译,因为pt的类型是指向int的指针,而matrix1是指向int [2]的指针。但是,你可以通过像这样的
来强制它pt[0] = (int*)&matrix1;
但它仍然无效,因为以下内容无效
pt[0][n][m]; //fails to compile
这是因为pt是一个指向int的指针数组,所以pt [0] [n]指向一个整数,而不是一个数组。因此,你不能使用索引
但是,如果您将其定义如下
int (*pt[2])[2] = {&matrix1,&matrix2}
然后,pt是一个指向二维数组的指针数组。因此,假设matrix1定义在x1,matrix2定义为x2,
pt[1][1][1]; //points to x2 + sizeof(int[2]) + sizeof(int)