尝试递增数组时出现“左值”错误

可能重复:
数组名是C中的指针吗?

假设我有一个char数组,说arr和arr将代表第一个元素的地址,所以arr ++应该是完全合法的,那么为什么编译器会说’左值’。

如果我这样做:arr = arr + 1那么为什么它是无效的转换。 我只是一个一个地增加指针。 编译器告诉LHS操作数类型是char [4]但是在RHS上它是char *。

main() { char arr[]={'a','b','c','d'}; for(;arr!=arr+4;arr++) //lvalue required printf("%c",*arr); } 

数组名称不是可以分配的变量。 如果要修改它,则应使用指针变量:

 char *arr_ptr = arr; 

然后你可以做arr_ptr++arr_ptr = arr_ptr+1 ;

数组不是指针。 arr不代表地址。

数组名称或数组类型的任何表达式被隐式转换为指向数组第一个元素的指针, 除非它是:

  • 一元& (地址)表达式的操作数(产生整个数组的地址,而不是第一个元素的地址 – 相同的内存地址,不同的类型); 要么
  • sizeof运算符的操作数( sizeof arr产生数组的大小,而不是指针的大小); 要么
  • _Alignof运算符的操作数( _Alignof arr产生数组的对齐,而不是指针的对齐); 要么
  • 初始值设定项中的字符串文字,用于初始化arrary对象。

_Alignof_Alignof的新function。

(转换通常被称为“腐朽”。)

这些都不适用于此,因此arr++ 尝试递增指针对象。 问题是,没有指针对象 ,只有指针arr ,在衰减到指针值之后,不是左值,这意味着它不能出现在赋值的左侧或作为++的操作数。

同样,给出:

 int x; 

表达式x是一个左值,所以你可以写x = 42; – 但是表达式(x + 1)不是左值,所以你不能写(x + 1) = 42; 。 您可以分配给x因为它引用了一个对象(x+1)不是指一个对象,所以没有什么可以分配给。 arr ,在它衰变之后,也不会引用一个对象(你有一个数组对象,但是没有指针对象)。

(你使用arr != arr + 4应该是一个线索;这永远不会是真的。)

而不是这个:

 char arr[] = {'a', 'b', 'c', 'd'}; for (; arr != arr + 4; arr++) { printf("%c", *arr); } 

你可以这样写:

 char arr[] = {'a', 'b', 'c', 'd'}; char *ptr; for (ptr = arr; ptr != arr + 4; ptr++) { printf("%c", &ptr); } 

顺便说一下,在程序的顶部,你应该改变这个:

 main() 

对此:

 #include  int main(void) 

另外,运行,不要走到comp.lang.c常见问题解答 ,阅读第6节“数组和指针”。