为什么两个相同值的整数指针指向同一个东西(via ==)?

时间:2013-10-11 19:47:55

标签: c pointers integer

int *x = 3;
int *y = 3;

if (x == y) "this statement evaluates to true" (pointer equality statement)
if (*x == *y) "this statement evaluates to true"

指针相等语句变为真的原因,仅仅是因为COMPILER看到两个“静态”数字“3”并且说,嘿指向同一个地方?或者一般来说整数都有一些魔力。

引用整数指针显然是多余的(在这种情况下)与不解除引用相同。

我已经看到了与字符串(Addresses of two pointers are same)有关的这个问题的一些例子,但是想要更多地澄清它。

3 个答案:

答案 0 :(得分:10)

int *x = 3;

这是无效的(约束违规),并且需要符合标准的编译器来发出诊断,并且可以完全拒绝它。您不能使用整数值来初始化指针(0的特殊情况除外,它是空指针常量)。

如果编译器碰巧接受它,可能将其视为等同于:

int *x = (int*)3;

导致指针x指向内存中的地址3。这几乎肯定是荒谬的。

鉴于xy与相同的表达初始化(并假设您的代码不被拒绝),这是不足为奇的是x == y是真实的。

解除引用x有未定义的行为; (int*)3很可能不是有效地址,因为它超出了程序的合法寻址空间和/或因为它未对齐。但如果 *x碰巧“工作”并产生一个值,那么*x == *y为真也就不足为奇了。编译器可能认识到x == y并因此得出结论*x == *y。您可以通过检查生成的代码来确定。但这真的没关系;一旦你的程序的行为是不确定的,毫不夸张的任何的可能发生(或者更确切地说,语言标准允许从字面上发生什么事;物理定律可能还有别的要说一下吧)

你应该收到两个声明的警告。如果你这样做,你应该留意它。如果没有,您应该了解如何增加编译器的警告级别。

答案 1 :(得分:6)

您只需为两个指针3硬编码固定内存地址。有理由认为这个简单的地址是相同的,并且无论数据实际上是哪个AT地址也都是相同的。

就像你的冰箱上有两个粘滞便笺。两人都说“钥匙在门上”。通过jove,当你去门口看时,有你的钥匙。两个不同的指针,都指向同一个东西。

答案 2 :(得分:2)

两个声明

int *x = 3;
int *y = 3;

是违反约束的。你可以声明

int *x = (int *)3;
int *y = (int *)3;

这两者都指的是记忆的地址3。

if (*x == *y) "this statement evaluates to true"  

没有。它调用未定义的行为。你可能得到任何东西。评估结果为truefalse