在C中取消引用指向二维数组的指针数组?

时间:2017-04-25 19:03:21

标签: c pointers multidimensional-array

我想知道是否可以在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]

但据我所知,这并不奏效。指针声明是错误的吗?

2 个答案:

答案 0 :(得分:3)

您必须将pt声明为数组指针数组。

 int (*pt[2])[2] = { matrix1, matrix2 };

Demo.

答案 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)