C - 3D 数组两列之间的地址差异

标签 c arrays

对于以下 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 * 的指针,取消引用的类型为 inta[0][0]a[1][0] 之间有六个 int 元素。

关于C - 3D 数组两列之间的地址差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438228/

相关文章:

c - 如何使用 clang 为 block 实现自定义保留释放

c - 如何取消映射并释放linux模块中的highmem页面

BZ2_bzBuffToBuffCompress()可以重复调用吗?

c - 解释C代码指令

c++ - 从文件中读取数字列表到动态数组

javascript - react .js : Toggle Buttons with children and parents

c - 如何创建函数,在 C 中没有 typedef 的情况下返回指向另一个函数的指针?

arrays - 二进制搜索只使用长度?

javascript - Javascript 中的一维数组到二维数组

ios - 将 SQL 数据从 Annotation click 传递到新 View