为什么我不能做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;
}
当您声明和定义一个数组时,数组的名称是一个表达式,其计算结果为数组第一个元素的地址。将名称视为保存第一个元素地址的常量。
一旦为数组分配了内存,就不能更改数组的地址。因此,数组标识符(名称)的值也不能更改。
在您的代码中,当您有
p = numbers++;
您要求将numbers
具有数组第一个元素的地址的常量值的 递增并指向第二个元素。这不是合法的操作。递增操作数需要 a modifiable lvalue
,并且数组的名称不是 a modifiable lvalue
。
什么是lvalue
? 它是一个locator value
: 标识可以保存另一个值的内存区域的东西。所以当你声明:
int a = 5;
a
表示一个足够大的内存区域可以容纳 a int
,并且该内存区域中容纳的int
是5
。您可以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
自身的值,只会改变 的值p
。numbers
仍然是&numbers[0]
并且p
将会是&numbers[1]
。
希望这很清楚!
numbers++
相当于numbers = numbers + 1
但是,numbers
这里是一个数组,不能修改数组的地址。
左值并不意味着“左值”
numbers
不是指针。它是一个具有此定义的数组int numbers[] = {1,2,3,4,5,6}
和一个右值。所以the compiler shows the message: "lvalue required as increment operand"
。
数组和指针的区别。指针 - 数组和指针的区别