#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]);
}
答案 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
并且对于第一个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
。这也意味着对于p
和q
,两者都指向某种类型T
(即*p
和*q
的类型为{{1} } {},当T
有效时,它会在p-q
和T
之间为您提供p
类型的元素数量。编译器会自动转换q
和p
值的差异,并将差异除以q
,以便为您提供正确的数字。
因此,当您打印单个指针值,然后自己减去这些值(例如在您的头脑中)时,您将获得sizeof(T)
次“太大”的数字。
在您的计算机上sizeof(T)
,这意味着12 / sizeof(int) == 3
为4。
顺便说一句,要打印指针值,您应该使用sizeof(int)
说明符:
%p