【问题标题】:Address of operator and L-values in cc中运算符的地址和L值
【发布时间】:2018-10-28 19:48:56
【问题描述】:

如果我运行以下代码:

int main(){
    int x = 0;
    int* y = &x;
    &x = y;
}

我得到错误:

需要左值作为赋值的左操作数

我理解这意味着当使用 addressof 运算符时,产生的指针不是有效的左值,正如 c 文档中所反映的那样。

我的问题很简单:为什么?

我无法更改指向变量 x 的指针的值的原因是什么?是防止程序员犯错,还是根本没有意义(这种情况请说明原因)

【问题讨论】:

标签: c pointers memory-address


【解决方案1】:

在这一行:

&x = y;

听起来您想说“我希望将x 存储在地址y 中”。

  1. 当你声明一个变量(x)时,它的地址(你称之为“指针值”)是一个常量值。它不是“左值”。 (“l”代表“left”,赋值操作的左边部分,所以是可赋值的。)
  2. 此外,您不应该自行决定系统在内存中设置数据的位置。
  3. 另外,您甚至不确定“y”地址是否是您的进程允许写入的已分配位置。

这里有三个不让你这样做的理由。 :)

【讨论】:

    【解决方案2】:

    这里& 运算符为您提供变量x 的地址,而您正试图为该地址分配一些东西,但这是不可能的,这没有意义。
    如果你想改变存储在x中的值,只需赋值给它:

    x = 5;
    

    如果你有一个指针 (int*) y 并且你想将它的值分配给x,使用* 操作符来获取 y 指向(存储在该地址)并将其分配给x

    x = *y;
    

    如果要将指针y 分配给x,这是不可能的。为此请使用另一个指针。

    int *y1 = y;
    

    【讨论】:

      【解决方案3】:

      在你的代码中

      &x = y
      

      此行显示错误,因为 &x 是一个常量指针,因此在初始化后无法更改

      【讨论】:

      • 这个问题与const-ness 无关,而是因为它不是左值。 &x 也不是一个有初始化概念的东西。
      猜你喜欢
      • 2022-01-23
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多