【问题标题】:"lvalue required as left operand of assignment" when using pointers in C在 C 中使用指针时“需要左值作为赋值的左操作数”
【发布时间】:2020-02-06 03:15:13
【问题描述】:

我想练习 C 中的指针。我收到一个错误,显示“需要左值作为赋值的左操作数”。错误显示在 &y=&x。那么如何将 x 的地址改写为 y 呢?

int main()
{
    int x=3;
    int y=4;
    &y=&x;
    printf("x=%p,y=%p",&x,&y);
    return 0;
}

【问题讨论】:

  • &y 只是变量y地址——你不能改变内存地址本身——你可以只更改存储在该地址的内容。

标签: c pointers


【解决方案1】:

y 是一个变量, &y 不是所以不能改变。 &y 只是获取该变量地址的一种方式。

【讨论】:

    【解决方案2】:

    变量的地址是不可变的。不允许更改。

    您可以做的是将该地址存储在指针变量中,然后将该指针更改为指向其他内容:

    int x=3, y=4;
    int *p;
    
    p = &x;
    *p = 2;
    printf("p=%p, &x=%p\n", (void *)p, (void *)&x);  // prints same value both times
    printf("x=%d\n", x);   // prints 2
    
    p = &y;
    *p = 7;
    printf("p=%p, &y=%p\n", (void *)p, (void *)&y);  // prints same value both times
    printf("y=%d\n", y);   // prints 7
    

    【讨论】:

      【解决方案3】:

      &y 无法重新分配。该位置是在编译时静态分配的,您无法在运行时更改它。

      【讨论】:

      • 好吧,地址本身直到操作系统虚拟内存管理器等运行时才分配......
      • @DavidC.Rankin 已分配。即使 excat 位置不是,它也会以某种方式分配,例如 fixed(有时用于全局变量),或 SP+offsetregisrer,或动态 heap 等。一旦分配它,您就无法在 C 中更改它。他尝试在编译器设置的位置设置变量y 的地址,该地址在main 启动时绑定。绑定位置可以在具有垃圾收集器的语言中更改,而不是通过 C。
      • 是的,是的,这就是我认为你的意思。偏移量。因此,您所谈论的任务究竟是什么,只是有点混乱。
      猜你喜欢
      • 2023-04-02
      • 2019-12-11
      • 2016-09-03
      • 2011-09-03
      • 2018-10-19
      相关资源
      最近更新 更多