2017-03-24 89 views
1

减去地址我创建了一个三维阵列在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

[C中的数组地址减法]的可能重复(http://stackoverflow.com/questions/9963708/array-address-subtraction-in-c) –

+0

'printf(“%d”,a [1] - 一个[0]);'---->'printf(“%p”,(void *)(a [1] - a [0]));' – LPs

+0

提供完整的代码,跟随? – LethalProgrammer

回答

0

让我们打破表达a[1] - a[0]开:

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

现在,当数组用于大多数上下文时,它们衰变为指向第一个元素的指针。因此a[i]将衰减为指向2d数组的指针int(*)[2]

差异根据指针运算规定在sizeof(int[2])中计算。你可以看到在[a[0], a[1])范围内有3个int[2]单位。

+0

谢谢您的破解和简化。我对指针和地址是新的,因此它非常有帮助 – shad3

+0

a [1]和[0]指向两个单独的对象。该行为未定义,如6.5.6§8中提到的一些类似的附加推理:http://stackoverflow.com/a/6291590/4082723,如果我不清楚。 – 2501

+0

@ 2501 a [1]衰减到一个超过[0]结尾的指针。该算法已被很好地定义。 – StoryTeller

2

我的理解是,[1]给我[1] [0] [0]元素和一个[0]的地址的地址的[0] [0] [0]。

这是不对的a[0]会给出第一个二维数组的地址。第一个2D阵列的地址和a[0][0][0]的地址可能是重合的,但它们并不相同。

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

+0

如果您区分“指针”(其中有类型)和“地址”(这些地址就是地址),这个答案会更好。因此,我将它称为*地址*是相同的 - 但类型不是(因此减法是不同的)。 –

+0

@Rishikesh Raje是的我得到&a + 1会给我的3d阵列后的内存位置的地址,即&a [2] [3] [2] + 1.但它是否会发生1,因为它会考虑完整的大小数组a在减法中? ((BA + 2 * 3 * 2 * 4)-BA))/ sizeof(a) – shad3