2

为什么我不能做p=numbers++or 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

4 回答 4

2

当您声明和定义一个数组时,数组的名称是一个表达式,其计算结果为数组第一个元素的地址。将名称视为保存第一个元素地址的常量。

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

在您的代码中,当您有

p = numbers++;

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

什么是lvalue? 它是一个locator value: 标识可以保存另一个值的内存区域的东西。所以当你声明:

int a = 5;

a表示一个足够大的内存区域可以容纳 a int,并且该内存区域中容纳的int5。您可以int通过分配更改它:

a = 7;

但标识符a仍然表示相同的内存区域。这意味着a是一个modifiable lvalue.

当你声明和定义你的数组时:

int numbers[] = { 1, 2, 3, 4, 5, 6 };

numbers是一个lvalue,因为它指定了一个存储指定整数数组的内存区域,但它不是modifiable。您可以更改 中元素的值numbers,但不能更改其numbers自身的值。numbers总是评估为&numbers[0]

如果要更改 wherep点,使其指向第二个元素而不是第一个元素,请使用:

p = numbers + 1;

这不会改变numbers自身的值,只会改变 的值pnumbers仍然是&numbers[0]并且p将会是&numbers[1]

希望这很清楚!

于 2013-09-10T03:52:36.770 回答
1

numbers++相当于numbers = numbers + 1

但是,numbers这里是一个数组,不能修改数组的地址。

左值并不意味着“左值”

于 2013-09-10T03:01:29.347 回答
1
于 2013-09-10T03:38:21.453 回答
0

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

数组和指针的区别。指针 - 数组和指针的区别

于 2013-09-10T03:01:51.753 回答