gcc 4.4.4
Что я делаю неправильно?
char x[10];
char y[] = "Hello";
while(y != NULL)
*x++ = *y++;
Большое спасибо за любой совет.
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;
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
как массивы, вы не можете их изменять. Одна из возможностей - использовать вместо них указатели:
char x[10];
char *xx = x;
char *y = "Hello";
while (*y != '\0')
*xx++ = *y++;
Обратите внимание, что я также исправил ваше условие завершения - указатель не станет NULL
только потому, что он достиг конца строки.
x
и y
- это массивы, а не указатели.
Они распадаются на указатели в большинстве контекстов выражений, таких как ваше выражение приращения, но они распадаются на r-значения, а не l-значения, и вы можете применять только операторы приращения к l-значениям.
Скорее всего, вы стали жертвой популярного заблуждения, что "массив - это указатель", т.е. когда вы определяете массив, то на самом деле вы получаете обычный указатель, который указывает на некоторый блок памяти, выделенный где-то. В вашем коде вы пытаетесь увеличить этот указатель.
Код не "работает", потому что в действительности массивы не являются указателями. Массивы - это массивы. Массивы не могут быть увеличены. В языке Си нет такой операции, как "увеличить массив". Фактически, массивы сами по себе в языке Си являются немодифицируемыми значениями. В языке Си нет операций, которые могут изменять сам массив (изменяемыми могут быть только отдельные элементы).
Если вы хотите обходить свои массивы, используя технику "скользящего указателя" (что вы, собственно, и пытаетесь сделать), вам нужно явно создать указатели и сделать их указывающими на начальные элементы ваших массивов
char *px = x;
char *py = y;
После этого вы можете увеличивать эти указатели сколько угодно.