lvalue需要作为增量操作数错误指针

时间:2014-06-25 18:23:58

标签: c

我只是想了解C中的指针概念并遇到了这个错误。 我得到了"左值作为增量操作数"以下代码的错误。请帮我理解是什么问题。

#include<stdio.h>

int main()
{
    char *s[] = {"black", "white", "pink", "violet"};
    ++s; //error at this line
    printf("%s\n", *s);
    char **ptr[] = {s+3, s+2, s+1, s}, ***p;
    p = ptr;
    ++p;
    printf("%s", **p+1);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

s是指向char的指针数组。数组名称是不可修改的l值。 ++s正在修改无法修改的s

Array Names vs Pointer Variables

  

正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且指针单元(适当类型)也被分配并初始化为指向第一个阵列的单元格。该指针单元格被赋予数组的名称。当为阵列单元分配存储器时,起始地址是固定的,即在程序执行期间不能改变它。因此,不应改变指针单元的值。为确保不更改此指针,在C中,数组名称不能用作赋值语句左侧的变量,即它们不能用作左值。相反,如果需要,可以声明适当类型的单独指针变量并将其用作左值。


建议阅读: Is array name a pointer in C?

答案 1 :(得分:1)

问题是在表达式中,数组名称被转换为指向数组第一个元素的指针的右值。在您的情况下,这是一个类型的临时对象char **已创建。您可能不会增加临时对象。这种情况类似于以下代码段中的情况

int x = 10;

++( x + 5 );

编译器将发出类似的错误消息。

例如,在您的代码段中,您可能无法编写

char **ptr[] = { ++(s+3), s+2, s+1, s};

编译器将发出相同的错误。事实上,当你写++s时,它等同于++( s + 0 ),你不处理原始数组,而是使用一些临时指针,即rvalue`