使用C中的指针进行多维数组访问

时间:2017-04-21 00:00:23

标签: c arrays pointers

请注意,之前可能已经回答过这个问题,但现在我可以理解它了。

我试图了解指针和数组如何协同工作。我以为我理解了如何以及为什么可以使用指针访问1D和2D数组,直到我试图将我的头部包裹在3D数组周围(为了清楚,我理解3D数组,而不是如何使用指针访问它们)。

所以假设我有一个数组x[5],我想使用指针访问元素x[1]。在这种情况下,我可以使用*(&x[0]+1),因为 x与&amp; x [0]相同,*(x + 1)可用于访问[1]。 < / p>

现在,对于2D数组,假设它被声明为x[5][3]

要访问x [1] [2],我可以使用*(&x[0][0]+3*1+2)。我可以理解这一点。我们从内存位置x [0] [0]开始,然后添加3 * 1以从x[0][0]x[1][0],然后添加2以从x[1][0]到{{1} }。

在我进入三维数组之前,上述内容对我有意义。我们假设x[1][2]被声明为x,我将如何使用相同的逻辑(如果可能)来说明元素x[3][4][5]?另外,我如何将此逻辑应用于更高维数组?

非常感谢任何有关此建议!

2 个答案:

答案 0 :(得分:0)

假设您有以下数组:

//x[i][j][k]
int x[2][3][5] = { {{0,1,2,3,4},
                    {5,6,7,8,9},
                    {10,11,12,13,14}},

                    {{ 88,1,2,3,4 },
                    { 5,6,7,8,9},
                    { 10,11,12,77,14}} 
                };

3D数组的元素在内存中串联排列如下:

{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{ 88,1,2,3,4 },{ 5,6,7,8,9},{ 10,11,12,77,14}

显然,如果您拥有第一个元素的地址,您可以通过添加偏移来访问其他元素。第一个元素的地址是**x,下一个元素的地址是**x+1,依此类推。要访问x数组的元素,请查看以下示例:

    int D3_width = sizeof(x)/sizeof(x[0]); //2
    int D2_width = sizeof(x[0]) / sizeof(x[0][0]); //3
    int D1_width = sizeof(x[0][0]) / sizeof(int); //5

    int i = 0, j = 2, k = 3;
    cout << *(**x + i*D2_width*D1_width + j*D1_width + k);

    output:13

您可以对其他多维数组使用相同的方法。

该公式经过测试并且运行良好。

答案 1 :(得分:-1)

对于二维数组,您可以使用指针算法跳过行的索引:

First index of first row + (length of row * desired Row)

如果你正在向上移动尺寸,这个表达式将开始变得相当大。

对于3D:

First index of first plane + (size of plane * desired plane)

请注意,该平面是二维结构。

现在进入4D:

First index of first cube + (size of cube * desired cube )

希望你明白这一点。