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”并说,嘿,将其指向同一个地方?或者一般来说整数有什么魔力。
显然,取消引用整数指针与不取消引用(在本例中)是一样的,这似乎是多余的。
我已经看到一些与字符串 ( Addresses of two pointers are same ) 有关的问题示例,但我想进一步阐明它。
最佳答案
int *x = 3;
这是无效的(违反约束),并且要求符合标准的编译器发出诊断,并且可能会完全拒绝它。您不能使用整数值来初始化指针(0
的特殊情况除外,它是一个空指针常量)。
如果编译器恰好接受它,它可能将它视为等同于:
int *x = (int*)3;
这会导致指针 x
指向内存中的地址 3
。这几乎可以肯定是荒谬的。
鉴于 x
和 y
是用相同的表达式初始化的(并且假设您的代码没有被拒绝),x = = y
为真。
取消引用 x
有未定义的行为; (int*)3
很可能不是有效地址,因为它在您的程序的合法寻址空间之外和/或因为它未对齐。但是如果 *x
碰巧“工作”并产生一个值,那么*x == *y
为真也就不足为奇了。编译器可能识别出 x == y
并因此得出结论 *x == *y
。您可以通过检查生成的代码来确定这一点。但这真的没关系;一旦程序的行为未定义,任何事情都可能发生(或者更确切地说,语言标准实际上允许任何事情发生;物理定律可能对此有其他说法)。
您应该收到针对这两个声明的警告。如果你这样做了,你应该注意它。如果没有,您应该了解如何提高编译器的警告级别。
关于c - 为什么两个相同值的整数指针指向相同的东西(通过==)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326070/