可能重复:
数组名是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
不代表地址。
数组名称或数组类型的任何表达式被隐式转换为指向数组第一个元素的指针, 除非它是:
_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节“数组和指针”。
以上就是c/c++开发分享尝试递增数组时出现“左值”错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/550061.html