c - 为什么两个相同值的整数指针指向相同的东西(通过==)?

标签 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"

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

显然,取消引用整数指针与不取消引用(在本例中)是一样的,这似乎是多余的。

我已经看到一些与字符串 ( Addresses of two pointers are same ) 有关的问题示例,但我想进一步阐明它。

最佳答案

int *x = 3;

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

如果编译器恰好接受它,它可能将它视为等同于:

int *x = (int*)3;

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

鉴于 xy 是用相同的表达式初始化的(并且假设您的代码没有被拒绝),x = = y 为真。

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

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

关于c - 为什么两个相同值的整数指针指向相同的东西(通过==)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326070/

相关文章:

C Socket程序创建Hive查询认证服务

c - 解密功能无法按预期工作

c - 用 C 访问 AVR 寄存器?

java - 在Java中如何在没有地板的情况下进行划分?

string - Swift 和 XCode 6 - 将整数转换为字符串

c - malloc() 与 free() 相比如何工作

用c扩展制作的对象可以相互实例化和管理吗?

c - 指向字符串数组的指针在函数中可以,但在外部不行

c - 排序篮球运动员名字的函数

c++ - 随机整数c++