当您声明和定义一个数组时,数组的名称是一个表达式,计算结果为数组第一个元素的地址。将名称视为保存第一个元素地址的常量。
一旦为数组分配了内存,就不能更改数组的地址。因此,数组标识符(名称)的值也不能更改。
在你的代码中,当你有
p = numbers++;
您要求 numbers 增加数组第一个元素的地址的常量值并指向第二个元素。这不是合法的操作。递增操作数需要modifiable lvalue,而数组的名称不是modifiable lvalue。
什么是lvalue?它是locator value:标识可以保存另一个值的内存区域的东西。所以当你声明:
int a = 5;
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]。
如果您想更改p 指向的位置,使其指向第二个元素而不是第一个元素,请使用:
p = numbers + 1;
这不会改变numbers 本身的值,只会改变p 的值。 numbers 仍然是 &numbers[0] 和 p 将是 &numbers[1]。
希望这很清楚!