增加向量地址并将其指定给指针

时间:2013-09-10 02:57:30

标签: c arrays pointers increment

为什么我不能p=numbers++p=++numbers?编译器显示消息:“左值作为递增操作数需要”但是指针p不是左值?

int main(int argc, char *argv[]){
    int numbers[] = {1,2,3,4,5,6}, *p;
    p=numbers++;
    printf("%d ",*p);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

numbers++相当于numbers = numbers + 1

但是,numbers这里是一个数组,你无法修改数组的地址。

左值并不意味着“左值”

答案 1 :(得分:1)

首先,我建议您阅读Arrays and Pointers上的C FAQ部分,这是更好的一般参考资料之一。

要直接解决您的错误,如果我们查看草案C99标准,我们会在章节6.5.2.4 Postfix递增和递减运算符中看到 6.5.3.1 前缀增量和减量运算符第1段中说:

  

前缀增量或减量运算符的操作数应具有限定或   不合格的真实或指针类型,并且应该是可修改的左值

部分6.3.2.1 Lvalues,数组和函数指示符第3段说:

  

除非它是sizeof运算符或一元&的操作数。运营商,或者是   用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,该指针指向数组的初始元素object和不是左值。 [...]

第1段说:

  

[...]可修改的左值是一个没有数组类型的左值,[...]

所以即使数组在很多情况下都会衰减到指向第一个元素的指针,但它不是lvalue

答案 2 :(得分:1)

声明和定义数组时,数组的名称是一个表达式,其值为数组的第一个元素的地址。将名称视为包含第一个元素地址的常量。

一旦为阵列分配了内存,就无法更改阵列的地址。因此,也不能更改数组标识符(名称)的值。

在您的代码中,当您有

p = numbers++;

你要求numbers增加并指向第二个元素,modifiable lvalue具有数组第一个元素的地址的常量值。这不是合法的操作。增量操作数需要modifiable lvalue,并且数组的名称不是lvalue

什么是locator value?它是int a = 5; :标识可以容纳另一个值的内存区域的东西。所以当你宣布:

a

int表示内存区域足以容纳int,并且该内存区域中的5int。您可以按任务更改a = 7;

a

但标识符a仍然表示相同的内存区域。这意味着modifiable lvalueint numbers[] = { 1, 2, 3, 4, 5, 6 };

声明和定义数组时:

numbers

lvaluemodifiable,因为它指定了一个包含指定整数数组的内存区域,但它不是numbers。您可以更改numbers中元素的值,但不能更改numbers本身的值。 &numbers[0]始终评估为p

如果您想更改p = numbers + 1; 点的位置,使其指向第二个元素而不是第一个元素,请使用:

numbers

这不会更改p本身的值,只会更改numbers的值。 &numbers[0]仍为p&numbers[1]为{{1}}。

希望这很清楚!

答案 3 :(得分:0)

numbers NOT 指针。它是一个具有此定义int numbers[] = {1,2,3,4,5,6}和rvalue的数组。所以the compiler shows the message: "lvalue required as increment operand"

数组和指针之间的区别。 Pointers - Difference between Array and Pointer