减去 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]
单位
我创建了一个 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])
.
int[2]
单位