在C中,为什么数组引用a + = 2;无效的代码

时间:2010-09-29 10:44:24

标签: c arrays

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

如下面的代码所示,可以为阵列名称分配 一个适当的指针,而不需要前面的&运营商。

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

为什么a += 2;无效?

任何人都可以帮忙澄清一下吗? 如果你想到一个更好的标题,也可以自由编辑标题。

4 个答案:

答案 0 :(得分:8)

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

赋值是问题 - 数组不是左值,因此您无法为它们分配任何内容。这是不允许的。即使你可以在这里出现类型不匹配 - 你也试图指向一个没有意义的数组指针。

答案 1 :(得分:7)

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

答案 2 :(得分:2)

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

但是

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

由于pa是标量,您可以使用

进行修改
pa = pa + 2;

pa += 2;

数组a没有定义像

这样的任何操作
a = a + 2;  /* invalid */

答案 3 :(得分:0)

当你写一个+ = 2然后它翻译成a = a + 2。

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

它将在编译时给出Lvalue所需的错误。