Sus*_*hil 7 c pointers pointer-arithmetic
我在书面测试中问了这个问题.在我的lapi上运行下面的代码时,我得到10作为输出
#include<stdio.h>
int main()
{
int *i, *j;/* two pointer variable*/
i = (int *)60;
j = (int *)20;
printf("%d \n",i-j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
10
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么输出10
.
Vla*_*cow 10
根据C标准(6.5.6添加剂操作员)
9当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.
因此,您的程序具有未定义的行为,因为指针不指向同一数组的元素.
Nevertheles似乎编译器只是生成一个用于减去两个指针的目标代码,而不管指针是否指向同一个数组的元素(它信任你).
在这种情况下,根据指针算术的两个指针之间的差异是可以在两个指针之间放置在存储器中的元素的数量.
在你的情况下,sizeof( int )
等于4
.因此,大小为40字节的内存可以容纳10
int类型的元素,只要它sizeof( int )
等于4
.
此值为10由printf函数输出.
您正在评估两个指针之间的差异或"距离" int
.sizeof(int)
在您的平台上是4.60和20之间的差值是40,即10个英尺之间的距离.您的实现似乎只是简单地评估这种差异.
但是,C标准限制了对两个指针之间差异的评估:两个指针都必须指向数组中的元素,或者指向一个结尾的元素.如果您可以确保i
并j
满足这一要求,那么差异评估是有效的.由于您的代码不一定满足该条件,因此它可能具有未定义的行为,在这种情况下,输出/结果可能是任何东西.
另请注意,取消引用是未定义的行为i
,j
除非它们指向保存int
值的有效地址.