lvalue需要作为增量操作数
gcc 4.4.4
我究竟做错了什么?
char x[10]; char y[] = "Hello"; while(y != NULL) *x++ = *y++;
非常感谢任何建议。
x++
是x = x + 1
的缩写forms。 但是,这里的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;
很可能你成了一个流行的误解“数组是一个指针”的受害者,也就是当你定义一个数组时你实际得到的是一个指向某个地方分配的某个内存块的普通指针。 在您的代码中,您尝试增加该指针。
代码没有“工作”,因为实际上数组不是指针。 数组是数组。 数组不能递增。 在C语言中没有“递增数组”这样的操作。 实际上,C中的数组本身是不可修改的左值。 C中没有可以修改数组本身的操作(只有单个元素可以修改)。
如果你想使用“滑动指针”技术遍历你的数组(你正在尝试这样做),你需要显式创建指针并使它们指向数组的起始元素
char *px = x; char *py = y;
之后,您可以根据需要增加这些指针。
C中的数组确实是指针,但是常量指针,这意味着在声明之后它们的值不能改变。
int arr[] = {1, 2, 3}; // arr is declared as const pointer.
(arr + 1)
是可能的,但是arr++
是不可能的,因为arr
不能存储另一个地址,因为它是常量。
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++
完成)并且您可以修改指针地址,因此我将数组的地址复制到单独的指针中然后递增它们。
如果你愿意,我相信你可以减少乐谱,但我希望你明白这一点。
x
和y
是数组,而不是指针。
它们在大多数表达式上下文中衰减为指针,例如增量表达式,但它们会衰减为rvalues,而不是lvalues,并且只能将增量运算符应用于左值。
由于您已将x
和y
都定义为数组,因此无法修改它们。 一种可能性是使用指针代替:
char x[10]; char *xx = x; char *y = "Hello"; while (*y != '\0') *xx++ = *y++;
请注意,我还修复了终止条件 – 指针不会因为它到达字符串的末尾而变为NULL
。
在大多数情况下,数组就像一个指针。
只记得你不能修改数组!
y++
是y = y + 1
。
char y[] = "Hello";
所以你在y++
时修改数组!!
它将产生error: lvalue required as increment operand
。
我们不能修改数组名称,但是f(int argv[])
argv++
怎么样?
来自K&R的引用p99“arrays名称不是变数; 像a = pa
和a++
这样a = pa
构造是非法的“,它表示数组的名称是初始元素位置的同义词。”
但是为什么在函数参数func(char *argv[])
,我们可以做argv++
尽管argv
是一个数组名。
在int *a[10]
,我们不能像argv++
这样做a++
argv++
。
数组的名称是初始元素位置的同义词。 — K&R
arrayname++
是非法的。
在函数参数中,例如char *argv[]
,它与char **argv
相同。 参数中的type *arrayname_para[]
是type **arrayname_para
的另一个同义词。
数组是常量指针。 我们无法改变它们。
int q; int *const p = &q; p = NULL; // this is not allowed.