3 D数组表示

时间:2017-10-21 13:36:05

标签: c arrays multidimensional-array indexing

假设我们有一个数组a [90] [30] [40],其中第一个元素从[1] [1] [1]开始,然后是[20] [20] [30]的索引。专栏主要代表?

根据我的说法,[x] [y] [z]表示x是深度,y是行,z是列。

所以根据我的说法,指数应为19(30)(40)+(29)(30)+(20-1)= 23689。

我读到https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays/,其中a [x] [y] [z]实际上意味着x是行,y是列,z是深度。

我在这里阅读了所有现有的答案以及上面的链接并且感到困惑。

我的计算是否正确?

2 个答案:

答案 0 :(得分:1)

  

我的计算是否正确?

不,因为你的基础是错误的。

第一个元素是a[0][0][0],因为索引从数组中的0开始,而不是1。

通常,3D数组的第一维是行,第二维是列,第三维是深度。

对于数组row and column major order,有两种流行的表示形式。

看起来你很困惑并且谈论Fortran数组(其中数组是列主要排序,索引从1开始),而不是C语言。

答案 1 :(得分:1)

我在评论中问你,你做了什么来解决这个难题?不是你的"计算"。编写三行代码就足以得到答案:

char a[10][10][10];


for (int i = 0; i < 10; i++)
    printf("&a[%1d][0][0] = %04zu\t\t&a[0][%1d][0] = %04zu\t\t&a[0][0][%1d] = %04zu\n", i, &a[i][0][0] - &a[0][0][0], i, &a[0][i][0] - &a[0][0][0], i, &a[0][0][i] - &a[0][0][0]);


&a[0][0][0] = 0000              &a[0][0][0] = 0000              &a[0][0][0] = 0000
&a[1][0][0] = 0100              &a[0][1][0] = 0010              &a[0][0][1] = 0001
&a[2][0][0] = 0200              &a[0][2][0] = 0020              &a[0][0][2] = 0002
&a[3][0][0] = 0300              &a[0][3][0] = 0030              &a[0][0][3] = 0003
&a[4][0][0] = 0400              &a[0][4][0] = 0040              &a[0][0][4] = 0004
&a[5][0][0] = 0500              &a[0][5][0] = 0050              &a[0][0][5] = 0005
&a[6][0][0] = 0600              &a[0][6][0] = 0060              &a[0][0][6] = 0006
&a[7][0][0] = 0700              &a[0][7][0] = 0070              &a[0][0][7] = 0007
&a[8][0][0] = 0800              &a[0][8][0] = 0080              &a[0][0][8] = 0008
&a[9][0][0] = 0900              &a[0][9][0] = 0090              &a[0][0][9] = 0009