对于以下 C 代码片段,
int a[2][3][2] = { { {1,2},{3,4},{5,6} },{{7,8},{9,10},{11,12} } };
printf("%d %d",a[1]-a[0],a[1][0]-a[0][0]);
这段代码给出了输出 3 6
,但我没有得到这个。
我可以将 3D 数组 a[2][3][2]
可视化为两个大小为 3x2 的 2D
数组,其索引如下:
a[0][0]--> | 1 2 || 7 8 | <--a[1][0]
a[0|[1]--> | 3 4 || 9 10|
| 5 6 || 11 12|
a[0] a[1]
设 a[0]
的地址为 1000
那么 a[1]
的地址将为 1012
,假设 int
的大小为 2 个字节。
所以 (a[1] - a[0])
应该是 12 ,但它给出了 3。3 实际上是矩阵中的行数。但是,要获得行数,代码应该是这样的这个:
(a[1] -a[0])/(row_size *sizeof(int));
类似地,在 a[1][0]-a[0][0]
的情况下。
我不明白这件事。 请解释。 谢谢。
最佳答案
让我们尝试写出数组在内存中的样子:
+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ | a[0][0][0] | a[0][0][1] | a[0][1][0] | a[0][1][1] | a[0][2][0] | a[0][2][1] | a[1][0][0] | a[1][0][1] | a[1][1][0] | a[1][1][1] | a[1][2][0] | a[1][2][1] | +------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ ^ ^ ^ ^ | | | | a[0][0] a[0][1] a[0][2] a[1][0] | | a[0] a[1]
当你这样做时a[1] - a[0]
您让子数组衰减为指向它们的第一个元素的指针,并且两个指针之间的区别在于它们的解引用类型的单位.
所以对于 a[0]
(和 a[1]
),类型是 int [3][2]
。它衰减为指向其第一个元素的指针,该元素的类型为 int (*)[2]
。解除引用的指针将是 int [2]
类型。现在 a[0]
和 a[1]
之间有多少个 int [2]
?有三个这样的元素,所以 a[1] - a[0]
的结果是 3
。
如果我们采用 a[1][0] - a[0][0]
,a[1][0]
和 的类型>a[0][0]
是 int [2]
。它衰减为类型为 int *
的指针,取消引用的类型为 int
。 a[0][0]
和 a[1][0]
之间有六个 int
元素。
关于C - 3D 数组两列之间的地址差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438228/