在C语言中,如何取消引用一个指向二维数组的指针数组?

3
我在想是否可以在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个回答

3
你需要将pt声明为一个指向数组的指针数组。
 int (*pt[2])[2] = { matrix1, matrix2 };

演示。


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是一个指向整数的指针数组,所以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)

这确实帮助我理解了,尽管之前的答案解决了问题,但我仍然没有完全掌握背后发生的事情。非常感谢! - Alex Q

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接