[英]Why are two integer pointers of the same value point to the same thing (via ==) ?
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”并且说,嘿指向同一个地方? 或者一般来说整数有一些魔力。
显然,冗余引用整数指针与未解除引用相同(在本例中)。
我已经看到了一些与字符串相关的问题的例子( 两个指针的地址是相同的 ),但是想要澄清它。
int *x = 3;
这是无效的( 违反约束 ),并且需要符合标准的编译器来发出诊断,并且可以完全拒绝它。 您不能使用整数值来初始化指针(除了0
的特殊情况,这是一个空指针常量 )。
如果编译器碰巧接受它,它可能会将其视为等效于:
int *x = (int*)3;
这导致指针x
指向内存中的地址3
。 这几乎肯定是荒谬的。
鉴于x
和y
使用相同的表达式进行初始化(假设您的代码未被拒绝), x == y
为真并不奇怪。
取消引用x
具有未定义的行为; (int*)3
很可能不是有效地址,因为它超出了程序的合法寻址空间和/或因为它未对齐。 但是如果 *x
碰巧“工作”并产生一个值,那么*x == *y
也是真的也就不足为奇了。 编译器可能认识到x == y
,因此得出*x == *y
结论。 您可以通过检查生成的代码来确定。 但这真的没关系; 一旦你的程序的行为未定义,完全可以发生任何事情(或者更确切地说,语言标准允许任何事情发生;物理定律可能还有别的东西可以说)。
您应该已经收到两个声明的警告。 如果你这样做,你应该留意它。 如果没有,您应该了解如何增加编译器的警告级别。
你只需要为两个指针硬编码一个固定的内存地址, 3
。 有理由认为这个简单的地址是相同的,并且无论数据实际上是哪个AT地址都是相同的。
这就像你的冰箱上有两个粘滞便笺。 两人都说“钥匙在门上”。 通过jove,当你去门口看时,有你的钥匙。 两个不同的指针,都指向同一件事。
这两个声明
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.