请注意,之前可能已经回答过这个问题,但现在我可以理解它了。
我试图了解指针和数组如何协同工作。我以为我理解了如何以及为什么可以使用指针访问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]
?另外,我如何将此逻辑应用于更高维数组?
非常感谢任何有关此建议!
答案 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 )
希望你明白这一点。