数组中地址差异的模糊性

时间:2012-10-20 17:44:41

标签: c memory-address

#include <stdio.h>
main()
{
    int a[] ={ 1,2,3,4,5,6,7};
    char c[] = {' a','x','h','o','k'};
    printf("%d ", (&a[3]-&a[0]));
}

程序的输出是3.但是,下面得到的值的输出差异是12.可以请某人解释歧义。

#include <stdio.h>
main()
{
    int a[] ={ 1,2,3,4,5,6,7};
    char c[] = {' a','x','h','o','k'};
    printf("%d     %d ", &a[3],&a[0]);
}

4 个答案:

答案 0 :(得分:2)

这称为指针算术。结果是值除以sizeof(int)

如果字节差异为12,且int的大小为4,则结果为12/4=3

顺便说一句,打印地址时使用格式说明符%p

printf("%p     %p ", &a[3],&a[0]);

答案 1 :(得分:1)

在第一种情况下,操作符'-'应用于指针,结果以元素数而不是绝对地址来度量。 看看这个:Pointer Arithmetic

答案 2 :(得分:0)

您正在打印地址

#include<stdio.h>
main()
{
 int a[] ={ 1,2,3,4,5,6,7};
char c[] = {' a','x','h','o','k'};
printf("%d     %d ", &a[3],&a[0]);

}

结果

-1085768040     -1085768052 

codepad

并且对于第一个Binyamin Sharet答案是完美的

答案 3 :(得分:0)

首先,编译器会自动将a[i]转换为*(a+i)(请参阅https://stackoverflow.com/a/1995156/226621以获得有趣的结果)。因此,&a[i]&*(a+i)a+i相同。这意味着:

&a[3]-&a[0]

相同
(a+3) - (a+0)

3。这也意味着对于pq,两者都指向某种类型T(即*p*q的类型为{{1} } {},当T有效时,它会在p-qT之间为您提供p类型的元素数量。编译器会自动转换qp值的差异,并将差异除以q,以便为您提供正确的数字。

因此,当您打印单个指针值,然后自己减去这些值(例如在您的头脑中)时,您将获得sizeof(T)次“太大”的数字。

在您的计算机上sizeof(T),这意味着12 / sizeof(int) == 3为4。

顺便说一句,要打印指针值,您应该使用sizeof(int)说明符:

%p