1
#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

4 回答 4

2

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

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

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

printf("%p     %p ", &a[3],&a[0]);
于 2012-10-20T17:47:28.757 回答
1

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

于 2012-10-20T17:54:44.383 回答
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 

键盘

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

于 2012-10-20T17:46:49.017 回答
0

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

&a[3]-&a[0]

是相同的

(a+3) - (a+0)

这是3。这也意味着 forpq,它们都是指向某种类型的指针T(即*p*q的类型T),并且当有效时,它会为您提供和之间p-q类型的元素数。编译器将自动转换 和 的值的差异并将该差异除以给您正确的数字。Tpqpqsizeof(T)

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

在你的机器上,12 / sizeof(int) == 3,这意味着它sizeof(int)是 4。

顺便说一句,要打印指针值,您应该使用%p说明符:

printf("%p %p\n", (void *)&a[3], (void *)&a[0]);
于 2012-10-20T18:12:21.737 回答