减去3d数组中的地址

时间:2017-03-24 10:16:44

标签: c dev-c++

我创建了一个3d数组

a[2][3][2]

现在我试图打印

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

我得到3作为输出。

据我所知,a [1]给出了[1] [0] [0]元素的地址,[0]给出了[0] [0] [0]的地址。

令[0] [0] [0]的地址为BA,然后[1] [0] [0]的地址为BA + 4 * 2 * 3,其中4字节是整数数据类型的存储空间

我期待结果是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;
}

2 个答案:

答案 0 :(得分:2)

  

据我所知,a [1]给出了[1] [0] [0]元素的地址,[0]给出了[0] [0] [0]的地址。

这是错误的a[0]将给出第一个2D数组的地址。第一个2D数组的地址和a[0][0][0]的地址可能是共同发生的,但它们并不相同。

具体而言&a +1不等于&a[0][0][0] +1

答案 1 :(得分:0)

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

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

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

差异按照sizeof(int[2])计算,由指针算法决定。您可以看到int[2]范围内有3个单位[a[0], a[1])