c 中运算符的地址和左值

Address of operator and L-values in c

如果我运行下面的代码:

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

我收到错误:

lvalue required as left operand of assignment

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

我的问题只是:为什么?

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

这一行:

&x = y;

听起来你想说 "I want x to be stored in the address y"。

  1. 当你声明一个变量(x)时,它的地址(你所说的"pointer value")是一个常量值。这不是 "lvalue"。 ("l" for "left",赋值操作的左边部分,所以可以赋值。)
  2. 此外,您并不打算自己决定系统在内存中设置数据的位置。
  3. 此外,您甚至不确定 "y" 地址是否是允许您的进程写入的分配位置。

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

此处 & 运算符为您提供了变量 x 的地址,您正试图将某些内容分配给该地址,但这是不可能的,这没有意义。
如果要更改存储在x中的值,只需分配给它:

x = 5;

如果你有一个指针 (int*) y 并且你想将它的值赋给 x,使用 * 运算符得到 value y 指向(存储在该地址中)并将其分配给 x

x = *y;

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

int *y1 = y;

在你的代码中

&x = y

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