我创建了一个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;
}
答案 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])
。