Значение l требуется в качестве операнда приращения - PullRequest
23 голосов
/ 29 июля 2010

gcc 4.4.4

Что я делаю не так?

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

Большое спасибо за любые советы.

Ответы [ 9 ]

28 голосов
/ 29 июля 2010

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;
21 голосов
/ 29 июля 2010

Скорее всего, вы стали жертвой распространенного заблуждения о том, что «массив - это указатель», т.е. когда вы определяете массив, то, что вы на самом деле получаете, - это обычный указатель, который указывает на какой-то блок памяти, выделенный где-то.В вашем коде вы пытаетесь увеличить этот указатель.

Код не «работает», поскольку в действительности массивы не являются указателями.Массивы - это массивы.Массивы не могут быть увеличены.Там нет такой операции, как «увеличить массив» на языке Си.Фактически, сами по себе массивы в C являются неизменяемыми значениями.В C нет операций, которые могли бы изменить сам массив (можно изменять только отдельные элементы).

Если вы хотите обойти свои массивы, используя технику «скользящего указателя» (это то, что вы на самом деле пытаетесьdo), вам нужно явно создать указатели и заставить их указывать на начальные элементы ваших массивов

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

После этого вы можете увеличивать эти указатели столько раз, сколько хотите.

7 голосов
/ 22 февраля 2013

Массивы в C действительно являются указателями, но постоянными указателями, что означает, что после объявления их значения не могут быть изменены.

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

(arr + 1) возможно, но arr++ невозможно, потому что arr не может хранить другой адрес, так как он постоянен.

5 голосов
/ 29 июля 2010
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++ в вашем коде), и вы можете изменить адрес указателя, я скопировал адресмассив в отдельные указатели и затем увеличивает их.

Если вы хотите, я уверен, что вы можете уменьшить обозначения, но я надеюсь, что вы поняли.

3 голосов
/ 29 июля 2010

x и y - это массивы, а не указатели.

Они распадаются на указатели в большинстве контекстов выражений, таких как выражение приращения, но затухают в значения r, а не в lval, и вы можете применять только операторы приращения к lvalues.

1 голос
/ 29 июля 2010

Поскольку вы определили как x, так и y как массивы, вы не можете их изменять.Вместо этого можно использовать указатели:

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

char *y = "Hello";

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

Обратите внимание, что я также исправил ваше условие завершения - указатель не станет NULL только потому, что он достиг конца строки.

0 голосов
/ 23 февраля 2016

Массивы - это постоянные указатели.Мы не можем их изменить.

int q;
int *const p = &q;
p = NULL; // this is not allowed.
0 голосов
/ 19 октября 2015

Мы не можем изменить имя массива, но как насчет argv++ в f(int argv[])?

Цитаты из K & R в p99 «имя массива не является переменной;конструкции типа a = pa и a++ недопустимы ", в которых говорится, что имя массива является синонимом местоположения исходного элемента."

Но почему в параметре функции func(char *argv[]) мы можем сделать argv++ несмотря на то, что argv является именем массива.

А в int *a[10] мы не можем сделать a++, как argv++.

Имя массивасиноним расположения исходного элемента. --- K & R

arrayname++ недопустим.

В параметре функции, например char *argv[], он совпадает с char **argv.type *arrayname_para[] в параметре является другим синонимом для type **arrayname_para.

0 голосов
/ 05 сентября 2014

В большинстве случаев массив похож на указатель.

Просто помните, что вы не можете изменить массив!

А y++ равно y = y + 1.

char y[] = "Hello";

Таким образом, вы изменяете массив, когда вы y++ !!

Это произведет error: lvalue required as increment operand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...