【问题标题】:Are `x = &v` and `*x = v` equivalent?`x = & v` 和 `*xv` 是等价的吗?
【发布时间】:2020-05-21 13:36:47
【问题描述】:
int * x;
int v = 7;

给定这段代码,有什么区别 1.x = &v 和 2.*x = v ? 我知道在这两种情况下,*x 都包含7,但x 在这两种情况下都包含v 的内存位置吗?如果不是,x 在情况 1 和 2 中包含什么,这是两者之间唯一显着的区别吗?

【问题讨论】:

  • *x=v 是未定义的行为。
  • "我知道在这两种情况下,*x 都包含 7" - 不,您的理解是错误的。您的第二个示例是 UB - 也就是无效/损坏/错误代码。
  • 您的意思是执行 both 语句,即x = &v 后跟*x = v?这与仅仅执行其中一个会产生不同的结果。

标签: c++ pointers


【解决方案1】:

鉴于声明:

int v = 7; 

v 在内存中有某个位置。正在做:

x = &v;

x“指向”v的内存位置,实际上*x的值将是7

但是,在此声明中:

*x = v;

您将v 的值存储在x 指向的地址。但是x 没有指向一个有效的内存地址,所以这个语句调用了未定义的行为。

所以要回答你的问题,,这两个陈述并不等同。

【讨论】:

  • 具体来说,*x = v 通常会将数字 7 写入内存中的随机字节。如果幸运的话,程序会崩溃。如果你不走运,你的进程内存中只有一个随机的 7。如果你真的不走运,你会将 7 写入其他东西拥有的内存中,causing the printer to destroy itself
【解决方案2】:

x = &v 修改 x。操作后x会指向v。

*x = v 修改 x 指向的对象。在示例中,x 没有指向任何东西,因为指针未初始化。因此,行为是未定义的。

【讨论】:

    【解决方案3】:

    & 表示地址。

    * 表示价值。

    x = &v中,v的地址被分配给x

    *x = v - x 的值(地址x 的值)被赋值为v

    【讨论】:

      【解决方案4】:

      这两个是非常不同的陈述。

      最初x 将包含垃圾值。因此*x 将尝试取消对未初始化地址的引用,并将导致未定义的行为(在大多数情况下为分段错误),因为*x 指的是未初始化的内容。因此*x = vv中的值赋给x所指向的位置。

      x = &v中,x将包含v的地址。此时x包含v的地址,*x将引用v中的值。因此这个说法是正确的。因此x = &vv的地址赋值为x的值。

      【讨论】:

        【解决方案5】:

        第一个赋值给x。第二个有未定义的行为。

        【讨论】:

          【解决方案6】:

          int v=7;

          假设v = 00ZXCDFCDGDD2345的地址

          int x=&v;

          这里的'&'表示的地址,x用来存放地址*(00ZXCDFCDGDD2345)*,而x本身存放在某个位置比如@987654324 @

          现在如果我们想访问 v 的值,我们使用指针。

          int *x=v;

          在这个语句中'*x'是一个指向v的指针变量,表示它存储v的值但是x本身是未定义的,它存储的是垃圾值。 因此两者是不同的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-03-20
            • 2012-11-22
            • 2019-11-08
            • 2020-12-18
            • 2021-09-23
            • 1970-01-01
            • 2010-12-25
            • 1970-01-01
            相关资源
            最近更新 更多