从我的演讲幻灯片中,它说:
如下面的代码所示,可以为阵列名称分配 一个适当的指针,而不需要前面的&运营商。
int x;
int a[3] = {0,1,2};
int *pa = a;
x = *pa;
x = *(pa + 1);
x = *(pa + 2);
a += 2; /* invalid */
为什么a += 2;
无效?
任何人都可以帮忙澄清一下吗? 如果你想到一个更好的标题,也可以自由编辑标题。
答案 0 :(得分:8)
a += 2
被翻译为a = a + 2
。向数组添加数字与向有效指针添加数字并生成新指针的数字相同。
赋值是问题 - 数组不是左值,因此您无法为它们分配任何内容。这是不允许的。即使你可以在这里出现类型不匹配 - 你也试图指向一个没有意义的数组指针。
答案 1 :(得分:7)
a += 2;
无效,因为未为数组定义+=
运算符。此外,数组是不可修改的lvalues
,因此您无法分配它们。
答案 2 :(得分:2)
当您将a传递给期望指针的函数时,将使用a的地址。这导致错误的语句,数组和指针是可互换的。
但是
由于pa是标量,您可以使用
进行修改pa = pa + 2;
或
pa += 2;
数组a没有定义像
这样的任何操作a = a + 2; /* invalid */
答案 3 :(得分:0)
当你写一个+ = 2然后它翻译成a = a + 2。
所以这意味着你修改了数组的基地址。 c中不允许这样做,因为如果修改数组的基址,那么如何访问数组元素。
它将在编译时给出Lvalue所需的错误。