【问题标题】:In C, why is an array reference a += 2; invalid code在C中,为什么数组引用a += 2;无效的代码
【发布时间】:2010-09-29 10:44:23
【问题描述】:

从我的演讲幻灯片中,它指出:

如下面的代码所示,可以分配数组名称
指向一个适当的指针,而不需要前面的 & 运算符。

int x;  
int a[3] = {0,1,2};  
int *pa = a;  
x = *pa;  
x = *(pa + 1);  
x = *(pa + 2);  
a += 2; /* invalid */  

为什么a += 2; 无效?

谁能帮忙澄清一下?
如果您想出更好的标题,也可以随时编辑标题。

【问题讨论】:

标签: c arrays


【解决方案1】:

a += 2 被翻译成a = a + 2。将数字添加到数组与将数字添加到有效并产生新指针的指针相同。

问题是赋值——数组不是左值,所以你不能给它们赋值。这是不允许的。即使你可以在这里存在类型不匹配 - 你试图分配一个指向一个没有意义的数组的指针。

【讨论】:

  • 谢谢,您已经清楚准确地回答了我的问题。但是我现在希望我记得/(被教导)什么是左值。我相信我的困惑是数组是指向第一个值的指针。
  • 左值基本上可以位于赋值语句的左侧(l 表示左侧)。所以基本上变量(数组除外)、指针取消引用(*ptr)、数组元素访问(array[index])和结构字段访问(str.field 或 ptr->field)都是左值。
  • @Sven:实际上它是一个左值,但你不能分配给它。 6.3.2.1/1,“可修改的左值是不具有数组类型、不具有不完整类型、不具有 const 限定类型,并且如果它是结构或联合,则没有任何成员的左值(包括,递归地,所有包含的聚合或联合的任何成员或元素)具有 const 限定类型”。可以说,术语“左值”因此是具有误导性的术语,因为有些左值不能是赋值的左值。 C++0x 通过引入几种新的表达方式“澄清”了这个问题 ;-)
  • @Steve:我也不知道。所以我应该写“可修改的左值”,一切都是正确的。
  • @Sven:是的,我同意你所说的一切。
【解决方案2】:

a += 2; 无效,因为没有为数组定义 += 运算符。此外,数组是不可修改的lvalues,因此您无法分配给它们。

【讨论】:

    【解决方案3】:

    当您将 a 传递给需要指针的函数时,将使用 a 的地址。这会导致错误的语句,数组和指针是可以互换的。

    但是

    • a 是一个数组
    • pa 是一个指针

    由于pa是一个标量,你可以用

    修改它
    pa = pa + 2;
    

    pa += 2;
    

    数组a没有定义类似的操作

    a = a + 2;  /* invalid */
    

    【讨论】:

      【解决方案4】:

      当您编写 a += 2 时,它会转换为 a = a + 2。

      所以这意味着你修改了数组的基地址。 这在 c 中是不允许的,因为如果你修改数组的基地址,那么你如何访问数组元素。

      它会在编译时给出 Lvalue required 错误。

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 1970-01-01
        • 2015-02-01
        • 2023-04-07
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 2013-07-27
        • 2012-12-03
        相关资源
        最近更新 更多