运算符的地址和c中的L值

时间:2018-10-28 19:48:57

标签: c pointers memory-address

如果我运行以下代码:

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

我得到了错误:

  

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

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

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

我不能更改指向变量x的指针的值的原因是什么?是为了防止程序员犯错误,还是从根本上说不通(在这种情况下,请解释原因)。

3 个答案:

答案 0 :(得分:2)

在这一行:

&x = y;

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

  1. 声明变量(x)时,其地址(称为“指针值”)为常数。它不是“左值”。 (“ l”代表“左侧”,是分配操作的左侧部分,因此可以分配。)
  2. 您也不必决定自己在系统中将数据设置在内存中的位置。
  3. 此外,您甚至不确定“ y”地址是否是进程允许写入的已分配位置。

此处不允许您这样做的三个原因。 :)

答案 1 :(得分:1)

这里&运算符为您提供了变量x的地址,并且您试图为该地址分配某些内容,但这是不可能的,这没有任何意义。
如果要更改存储在x中的值,只需为其赋值:

x = 5;

如果您有指针(int*y,并且想要将其值分配给x,请使用*运算符获取 y指向(存储在该地址中)并将其分配给x

x = *y;

如果要将指针y分配给x,则不可能。为此,请使用其他Poiner。

int *y1 = y;

答案 2 :(得分:-1)

在您的代码中

&x = y

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