Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Arrays_Pointers - Fatal编程技术网

在C语言中使用指针访问多维数组

在C语言中使用指针访问多维数组,c,arrays,pointers,C,Arrays,Pointers,请注意,这个问题以前可能已经得到了回答,但现在我可以理解了 我试图理解指针和数组是如何协同工作的。我想我已经理解了如何以及为什么可以用指针访问一维和二维数组,直到我试着用三维数组来概括我的想法,只是为了清楚,我理解三维数组,而不是如何用指针访问它们 假设我有一个数组x[5],我想使用指针访问元素x[1]。在这种情况下,我可以使用*x[0]+1,因为x与&x[0]相同,*x+1可以用于访问[1] 现在,对于2D数组,假设它被声明为x[5][3] 要访问x[1][2],我可以使用*&x[0][0]+

请注意,这个问题以前可能已经得到了回答,但现在我可以理解了

我试图理解指针和数组是如何协同工作的。我想我已经理解了如何以及为什么可以用指针访问一维和二维数组,直到我试着用三维数组来概括我的想法,只是为了清楚,我理解三维数组,而不是如何用指针访问它们

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

现在,对于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]到x[1][2]

在我得到一个三维数组之前,上面的内容对我来说是有意义的。假设x被声明为x[3][4][5],如果可能的话,我将如何使用相同的逻辑得到元素x[2][1][3]?另外,如何将此逻辑应用于高维数组


非常感谢您对此提出的任何建议

对于二维数组,您可以使用指针算法跳过行的索引,就像您所做的那样:

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 )

希望您能理解。

假设您拥有以下阵列:

//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
对于其他多维数组,可以使用相同的方法


该公式经过测试,效果良好。

x与&x[0]-NOOO相同。很抱歉大声喊叫,但这已经被问到了,回答了,并且在这里讨论的太多了做研究!提示:数组不是指针。@Olaf ok,很好,但是1。我是通过实际调查得到这些信息的。2.我跟不上这里正在进行的所有讨论。3.它们返回相同的值。4.我的问题是关于使用指针访问数组的,因此,虽然这条特定语句在技术上可能不正确,但它并没有改变我想知道的内容:@Olaf另外,你能给我一个很好的解释,说明这两条语句之间的区别吗?我只是好奇……而且你知道的越多越好:你可能会从那里收集到很多非常好和非常相关的答案。恕我直言,从10231搜索结果中挑选相关答案可能是一个挑战,但如果你在消化了答案后仍有疑问,可以在此处编辑问题并添加细节。@DavidC.Rankin谢谢!今天晚些时候到家后我会看一遍,如果有更多的内容要补充,我会更新我的q。@AjayBrahmakshatriya我认为在**x中,x衰减到int*[3][5],它被解引用到int[3][5],它被解引用到int*[5],它被解引用到int[5],它被解引用到int*[5]。。。所以**x给出了一个int*,用一种相当混乱的方式。我个人会避免这样做,但似乎有效。@Dmitri啊,我误读了一些部分。将删除我的评论。谢谢