假设我们有一个数组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是深度。
我在这里阅读了所有现有的答案以及上面的链接并且感到困惑。
我的计算是否正确?
答案 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