gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:11:16 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com