我只是想了解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;
}
答案 0 :(得分:1)
s
是指向char
的指针数组。数组名称是不可修改的l值。 ++s
正在修改无法修改的s
。
Array Names vs Pointer Variables:
正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且指针单元(适当类型)也被分配并初始化为指向第一个阵列的单元格。该指针单元格被赋予数组的名称。当为阵列单元分配存储器时,起始地址是固定的,即在程序执行期间不能改变它。因此,不应改变指针单元的值。为确保不更改此指针,在C中,数组名称不能用作赋值语句左侧的变量,即它们不能用作左值。相反,如果需要,可以声明适当类型的单独指针变量并将其用作左值。
答案 1 :(得分:1)
问题是在表达式中,数组名称被转换为指向数组第一个元素的指针的右值。在您的情况下,这是一个类型的临时对象char **
已创建。您可能不会增加临时对象。这种情况类似于以下代码段中的情况
int x = 10;
++( x + 5 );
编译器将发出类似的错误消息。
例如,在您的代码段中,您可能无法编写
char **ptr[] = { ++(s+3), s+2, s+1, s};
编译器将发出相同的错误。事实上,当你写++s
时,它等同于++( s + 0 )
,你不处理原始数组,而是使用一些临时指针,即rvalue`