Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中取消对二维数组的指针数组的引用?_C_Pointers_Multidimensional Array - Fatal编程技术网

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

在C中取消对二维数组的指针数组的引用?,c,pointers,multidimensional-array,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] 但据我

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

但据我所知,这是行不通的。指针声明是否错误?

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

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

提供的答案是正确的,但缺乏解释。我认为,如果你理解你的方法失败的原因,这会更有帮助

在指针上使用数组索引的工作方式是使用数据类型的大小递增指针

例如,如果我们定义一个数组,如下所示:

int a[2] = {1,2};
并假设数组是在位置x的内存中创建的

a[0]; // points at x
a[1]; //points at x + sizeof(int)
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 a[2][2] = {{1,2},{3,4}}
再次假设位置x

a[0]; // points at x
a[1]; //points at x + sizeof(int)
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)

这确实帮助了我理解,尽管前面的答案解决了这个问题,但我仍然没有完全理解幕后发生的事情。谢谢!