【问题标题】:"lvalue required" error when trying to increment array [duplicate]尝试增加数组时出现“需要左值”错误[重复]
【发布时间】:2012-11-19 23:18:02
【问题描述】:

可能重复:
Is array name a pointer in 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);
}

【问题讨论】:

  • 发布你迄今为止尝试过的代码
  • "arr 将表示第一个元素的地址" 不,它将表示一个数组。该数组可能会隐式转换为指针,其值与&arr[0] 相同,但这不会使其成为指针。

标签: c arrays lvalue


【解决方案1】:

数组名不是可以赋值的变量。如果你想修改它,你应该使用一个指针变量:

char *arr_ptr = arr;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • arr 确实代表了第一个元素的地址。
    • @GrijeshChauhan 不,它没有(而且几乎没有连贯性)。
    • 我的意思是arr 包含第一个元素的地址..虽然我不是反对者!
    • arr 不包含地址。
    【解决方案3】:

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

    • 一元& (address-of) 表达式的操作数(产生整个数组的地址,而不是其第一个元素的地址——相同的内存地址,不同的类型);或
    • sizeof 运算符的操作数(sizeof arr 产生数组的大小,而不是指针的大小);或
    • _Alignof 运算符的操作数(_Alignof arr 产生数组的对齐方式,而不是指针的对齐方式);或
    • 用于初始化数组对象的初始化程序中的字符串文字。

    _Alignof 是 C2011 的新成员。

    (转换通常被称为“衰减”。)

    这些都不适用,所以arr++尝试增加一个指针对象。问题是,没有指针object,只有一个指针valuearr,在衰减为指针值后,不是左值,这意味着它不能出现在赋值的左侧,也不能作为++的操作数。

    同样,给定:

    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 节“数组和指针”。

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2018-05-25
      • 2016-04-16
      相关资源
      最近更新 更多