4
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"

指针相等语句成为真的原因,仅仅是因为编译器看到两个“静态”数字“3”并说,嘿指向同一个地方吗?或者一般来说整数有什么魔力。

显然,引用整数指针与不取消引用相同(在这种情况下)似乎是多余的。

我已经看到了一些与字符串有关的问题的示例(两个指针的地址相同),但想进一步澄清它。

4

3 回答 3

10
int *x = 3;

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

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

int *x = (int*)3;

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

鉴于xandy使用相同的表达式进行初始化(并假设您的代码没有被拒绝),这并不奇怪x == y

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

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

于 2013-10-11T19:54:23.500 回答
6

您只是为两个指针硬编码了一个固定的内存地址,3. 理所当然地,这个简单的地址是相同的,并且无论数据实际上是在该地址中的任何数据也将是相同的。

就像你的冰箱上有两张便签纸一样。两者都说“钥匙在逐个桌子上”。天哪,当你走到门口时,你的钥匙就在那儿。两个不同的指针,都指向同一个东西。

于 2013-10-11T19:50:42.570 回答
2

两者的声明

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

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

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

这些都指的是内存的地址3。

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

不,它会调用未定义的行为。你可能会得到任何东西。这要么评估为true要么false

于 2013-10-11T19:50:29.333 回答