假设我有一个char数组,说arr和arr将代表第一个元素的地址,所以arr ++应该是完全合法的,那么为什么编译器会说'lvalue required'。
如果我这样做: 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);
}
答案 0 :(得分:6)
数组名称不是可以分配的变量。如果要修改它,则应使用指针变量:
char *arr_ptr = arr;
然后,您可以arr_ptr++
和arr_ptr = arr_ptr+1
;
答案 1 :(得分:2)
数组不是指针。 arr
不代表地址。
答案 2 :(得分:2)
数组名称或数组类型的任何表达式被隐式转换为指向数组第一个元素的指针,除非它是:
&
(地址)表达式的操作数(产生整个数组的地址,而不是第一个元素的地址 - 相同的内存地址,不同的类型);或sizeof
运算符的操作数(sizeof arr
产生数组的大小,而不是指针的大小);或_Alignof
运算符的操作数(_Alignof arr
产生数组的对齐,而不是指针的对齐);或 _Alignof
是C2011中的新内容。
(转换通常被称为“腐朽”。)
这些都不适用于此,因此arr++
尝试增加指针对象。问题是,没有指针 object ,只有指针值。 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 <stdio.h>
int main(void)
另外,跑步,不要走路,到comp.lang.c FAQ并阅读第6节“阵列和指针”。