c中运算符和L值的地址

c中运算符和L值的地址,c,pointers,memory-address,C,Pointers,Memory Address,如果我运行以下代码: int main(){ int x = 0; int* y = &x; &x = y; } 我得到一个错误: 赋值的左操作数需要左值 我理解这意味着当使用addressof运算符时,生成的指针不是有效的左值,正如c文档中所反映的那样 我的问题是:为什么 我无法更改指向变量x的指针的值的原因是什么?这是为了防止程序员犯错误,还是根本没有意义(在这种情况下,请解释原因)。在这一行: &x = y; 听起来你想说“我希望x存储在

如果我运行以下代码:

int main(){
    int x = 0;
    int* y = &x;
    &x = y;
}
我得到一个错误:

赋值的左操作数需要左值

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

我的问题是:为什么

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

在这一行:

&x = y;
听起来你想说“我希望
x
存储在
y
地址中”

  • 当您声明一个变量(
    x
    )时,它的地址(您称之为“指针值”)是一个常量值。这不是“左值”。(“l”表示“左”,赋值操作的左部分,因此是可赋值的。)
  • 此外,您不需要自行决定系统在内存中设置数据的位置
  • 另外,您甚至不确定“y”地址是否是流程允许写入的分配位置
  • 这里有三个不让你这么做的原因:

    在这一行中:

    &x = y;
    
    听起来你想说“我希望
    x
    存储在
    y
    地址中”

  • 当您声明一个变量(
    x
    )时,它的地址(您称之为“指针值”)是一个常量值。这不是“左值”。(“l”表示“左”,赋值操作的左部分,因此是可赋值的。)
  • 此外,您不需要自行决定系统在内存中设置数据的位置
  • 另外,您甚至不确定“y”地址是否是流程允许写入的分配位置

  • 这里有三个不让你这么做的原因:

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

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

    x = *y;
    
    如果要将指针
    y
    指定给
    x
    ,则不可能。使用另一个poiner

    int *y1 = y;
    

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

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

    x = *y;
    
    如果要将指针
    y
    指定给
    x
    ,则不可能。使用另一个poiner

    int *y1 = y;
    
    在代码中

    &x = y
    
    这一行显示一个错误,因为&x是一个常量指针,因此在代码中初始化后无法更改它

    &x = y
    

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

    可能的重复与
    x+1=3
    一样有意义。可能的重复与
    x+1=3
    一样有意义。该问题与
    常量无关,但事实上它不是左值
    &x
    也不是一个具有初始化属性概念的东西。这个问题与
    const
    -ness无关,而是与它不是左值这一事实有关
    &x
    也不是一个具有初始化性概念的东西。