为什么以下代码打印1作为输出?

时间:2015-04-08 16:53:02

标签: c pointers

指针的差异给出1作为输出..

#include<string.h>
#include<stdio.h>
int main()
{  
    int a=5,b=10;
    int *p=&a,*q=&b;
    int c=p-q;
    printf("%d",c); 
    return 0;
}

5 个答案:

答案 0 :(得分:4)

减去两个没有指向同一个数组的指针毫无意义。

C11:6.5.6加法运算符(p8)

  

[...]如果指针操作数和结果都指向相同数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义

答案 1 :(得分:2)

你在这里减去指针:

int c=p-q;

你应该这样做:

int c=*p-*q;

两个指针的位置接近是偶然的,否则你可以获得任何价值。感谢haccks answer - 请阅读:

C11:6.5.6加法运算符(p8)

  

[...]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义

答案 2 :(得分:1)

p-q有意义,p和q应该指向同一个数组。
但是代码中的p-q是未定义的

答案 3 :(得分:1)

通常实现C的方式是函数在堆栈上分配一些空间,并且需要有内存地址的所有局部变量都放在这个空间中。

变量将以某种自然顺序放置在此内存中似乎很自然,例如声明它们的顺序或反向,或者按字母顺序排列。

此外,int变量通常可以很好地存储在内存中。

因此,期望ab存储在相邻的内存位置,而&a - &b可以是1或{{-1,这是很自然的。 1}}。

现在,你不应该依赖这里发生的任何合理事情; C标准并不保证你应该得到什么结果,甚至暗示首先要求差异是有意义的。这是未定义的行为,因为ab是完全独立的对象。 C标准允许此差异返回1-142,甚至允许您的程序擦除您的硬盘,破坏您的信用评分,甚至返回一个如此深不可测的结果人类的思想只是通过类比我们称它为一个数字。

答案 4 :(得分:0)

这里, c 保存两个整数类型地址的差异。并且这个差异是1. 5存储在地址中,10也存储在地址中。 p q 是存储此5和10的地址。