在C语言中使用指针访问多维数组
请注意,这个问题以前可能已经得到了回答,但现在我可以理解了 我试图理解指针和数组是如何协同工作的。我想我已经理解了如何以及为什么可以用指针访问一维和二维数组,直到我试着用三维数组来概括我的想法,只是为了清楚,我理解三维数组,而不是如何用指针访问它们 假设我有一个数组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]?另外,如何将此逻辑应用于高维数组在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]+
非常感谢您对此提出的任何建议 对于二维数组,您可以使用指针算法跳过行的索引,就像您所做的那样:
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啊,我误读了一些部分。将删除我的评论。谢谢