C 用符号arr+解释左值和右值;4和arr++;

C 用符号arr+解释左值和右值;4和arr++;,c,C,为什么C语言编译器不能用arr++说“需要左值”来编译,但可以 使用arr+4成功编译?arr++表示法的左值概念是什么?当您使用arr时,它会自然衰减为指向其第一个元素的指针,即它相当于&arr[0] 当您执行arr++操作时,您尝试修改此指针(有效地执行arr=arr+1)。这是不可能的,因为阵列的位置是固定的,无法修改 使用arr+4可以进行指针运算。在这里,您将4添加到衰减的指针,但不尝试修改指针本身。这实际上等于&arr[4] 您显示的代码中还有一个小问题。我说小,但我的意思是大 与

为什么C语言编译器不能用
arr++
说“需要左值”来编译,但可以
使用
arr+4
成功编译?
arr++
表示法的左值概念是什么?

当您使用
arr
时,它会自然衰减为指向其第一个元素的指针,即它相当于
&arr[0]

当您执行
arr++
操作时,您尝试修改此指针(有效地执行
arr=arr+1
)。这是不可能的,因为阵列的位置是固定的,无法修改

使用
arr+4
可以进行指针运算。在这里,您将
4
添加到衰减的指针,但不尝试修改指针本身。这实际上等于
&arr[4]


您显示的代码中还有一个小问题。我说小,但我的意思是大

让数组衰减为指针。然后尝试使用
“%u”
格式说明符打印此指针。但格式说明符是打印
int
,而不是指针。格式说明符和参数类型不匹配会导致未定义的行为

要删除一般(
void*
)指针,您需要使用
%p”
格式,并将指针强制转换为
void*

printf("%u", arr);

arr
最终不是左值(因为它是衰减的结果),您只能对左值使用修改增量运算符。对添加没有这样的限制(例如,可以说
1+1
)。发布一个其他人可以编译和测试的完整程序。实际
arr+4的可能重复什么也不做。语法上是正确的,但它是一个没有效果的语句,只会被忽略。谢谢。我明白了。很好的解释。
printf("%u", arr);
printf("%p", (void *) arr);