减去 3d 数组中的地址

Subtracting addresses in a 3d array

我创建了一个 3d 数组

a[2][3][2]

现在当我尝试打印时

printf("%d",a[1] - a[0]);

我得到 3 作为输出。

我的理解是 a[1] 给了我 a[1][0][0] 元素的地址,a[0] 给了我 a[0][0][0] 的地址。

设地址a[0][0][0]为BA则地址a[1][0][0]为BA + 4*2*3其中4字节为内存space 整数数据类型

我原以为结果是 6。

同样我试过

printf("%d",(&a + 1) - &a);

收到的输出是 1。

我哪里错了?

编辑 1:完整代码

#include<stdio.h>

int main(){
    int a[2][3][2] = {{{1,2},{3,4},{5,6}},{{7,8},{9,10},{11,12}}};
    printf("%d",a[1]-a[0]);
    return 0;
}

What I understand is that a[1] gives me the address of a[1][0][0] element and a[0] the address of a[0][0][0].

这是错误的a[0]会给出第一个二维数组的地址。第一个二维数组的地址和a[0][0][0]的地址可能重合,但并不相同。

具体来说&a +1不等于&a[0][0][0] +1

让我们将表达式 a[1] - a[0] 分开:

a[1] - 指的是第二个 [3][2] 数组。
a[0] - 指第 [3][2] 个数组。

现在,当在 大多数 上下文中使用数组时,它们会退化为指向第一个元素的指针。所以 a[i] 将衰减为指向二维数组的指针 int(*)[2].

差异是根据指针算法在 sizeof(int[2]) 中计算的。并且可以看到 [a[0], a[1]).

范围内有 3 个 int[2] 单位