gcc 4.4.4
我做错了什么?
char x[10];
char y[] = "Hello";
while(y != NULL)
*x++ = *y++;
非常感谢您的任何建议。
答案 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)
x
和y
是数组,而不是指针。
它们在大多数表达式上下文中衰减为指针,例如增量表达式,但它们会衰减为rvalues,而不是lvalues,并且只能将增量运算符应用于左值。
答案 5 :(得分:1)
由于您已将x
和y
都定义为数组,因此无法对其进行修改。一种可能性是使用指针代替:
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 = pa
和a++
这样的结构是非法的#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.