lvalue需要作为递增操作数

时间:2010-07-29 15:53:44

标签: c pointers

gcc 4.4.4

我做错了什么?

char x[10];
char y[] = "Hello";
while(y != NULL)
    *x++ = *y++;

非常感谢您的任何建议。

9 个答案:

答案 0 :(得分:28)

x++x = x + 1的缩写形式。但是,x这里是一个数组,您无法修改数组的地址。您的变量y也是如此。

您可以声明一个整数i并递增该数组,然后访问数组的i'索引,而不是尝试递增数组。

char x[10], y[5] = "Hello";
int i = 0;
while (y[i] != 0)
{
    x[i] = *y[i];
    i++;
}
x[i] = 0;

答案 1 :(得分:21)

很可能你成了一个流行的误解“数组是一个指针”的受害者,也就是当你定义一个数组时你实际得到的是一个普通的指针,它指向某个地方分配的某个内存块。在你的代码中,你试图增加指针。

代码没有“工作”,因为实际上数组不是指针。数组是数组。数组不能递增。在C语言中没有“增加数组”这样的操作。实际上,C中的数组本身是不可修改的左值。 C中没有可以修改数组本身的操作(只有单个元素可以修改)。

如果你想使用“滑动指针”技术遍历你的数组(你正在尝试这样做),你需要显式创建指针并使它们指向数组的起始元素

char *px = x;
char *py = y;

之后,您可以根据需要增加这些指针。

答案 2 :(得分:7)

C中的数组确实是指针,但是常量指针,这意味着在声明之后它们的值无法改变。

int arr[] = {1, 2, 3};
// arr is declared as const pointer.

(arr + 1)是可能的,但arr++是不可能的,因为arr无法存储另一个地址,因为它是常量。

答案 3 :(得分:5)

char x[10];
char y[] = "Hello";
char *p_x = &x[0];
char *p_y = &y[0];
while(*p_y != '\0') *p_x++ = *p_y++;

由于您无法修改数组地址(在代码中由x++y++完成)并且可以修改指针地址,因此我复制了地址将数组分成单独的指针,然后增加它们。

如果你愿意,我相信你可以减少乐谱,但我希望你明白这一点。

答案 4 :(得分:3)

xy是数组,而不是指针。

它们在大多数表达式上下文中衰减为指针,例如增量表达式,但它们会衰减为rvalues,而不是lvalues,并且只能将增量运算符应用于左值。

答案 5 :(得分:1)

由于您已将xy都定义为数组,因此无法对其进行修改。一种可能性是使用指针代替:

char x[10];
char *xx = x;

char *y = "Hello";

while (*y != '\0')
    *xx++ = *y++;

请注意,我还修复了你的终止条件 - 指针不会变成NULL只是因为它已到达字符串的末尾。

答案 6 :(得分:0)

在大多数情况下,数组就像一个指针。

记住你无法修改数组!

y++y = y + 1

char y[] = "Hello";

所以你在y++ !!

时修改数组

它将产生error: lvalue required as increment operand

答案 7 :(得分:0)

我们无法修改数组名称,但argv++中的f(int argv[])呢?

来自K& R的引言p99“数组名称不是变数;像a = paa++这样的结构是非法的#34;它表示数组的名称是初始元素位置的同义词。“

但是为什么在函数参数func(char *argv[])中,尽管argv++是数组名称,但我们可以argv

int *a[10]中,我们无法像a++那样argv++

数组的名称是初始元素位置的同义词。 --- K& R

arrayname++是非法的。

在函数参数中,例如char *argv[],它与char **argv相同。参数中的type *arrayname_para[]type **arrayname_para的另一个同义词。

答案 8 :(得分:-2)

数组是常量指针。我们无法改变它们。

int q;
int *const p = &q;
p = NULL; // this is not allowed.