gcc 4.4.4
Qu'est-ce que je fais mal?
char x[10];
char y[] = "Hello";
while(y != NULL)
*x++ = *y++;
Merci beaucoup pour tout conseil.
x++
est la forme abrégée de x = x + 1
. Cependant, x
est un tableau et vous ne pouvez pas modifier l'adresse d'un tableau. Il en va de même pour votre variable y
.
Au lieu d'essayer d'incrémenter des tableaux, vous pouvez déclarer un entier i
et l'incrémenter, puis accéder à l'index i
'ème d'un tableau.
char x[10], y[5] = "Hello";
int i = 0;
while (y[i] != 0)
{
x[i] = *y[i];
i++;
}
x[i] = 0;
Très probablement, vous avez été victime d'une idée fausse populaire selon laquelle "tableau est un pointeur", c'est-à-dire que lorsque vous définissez un tableau, vous obtenez un pointeur ordinaire pointant vers un bloc de mémoire alloué quelque part. Dans votre code, vous essayez d'incrémenter ce pointeur.
Le code ne "fonctionne" pas car, en réalité, les tableaux ne sont pas des pointeurs. Les tableaux sont des tableaux. Les tableaux ne peuvent pas être incrémentés. Il n'y a pas d'opération telle que "incrémenter un tableau" en langage C. En fait, les tableaux eux-mêmes dans C sont non modifiables lvalues. Aucune opération en C ne peut modifier le tableau lui-même (seuls des éléments individuels peuvent être modifiables).
Si vous souhaitez parcourir vos tableaux à l'aide de la technique du "pointeur coulissant" (ce que vous essayez réellement de faire), vous devez créer les pointeurs explicitement et les faire pointer vers les éléments de départ de vos tableaux.
char *px = x;
char *py = y;
Après cela, vous pouvez incrémenter ces pointeurs autant que vous le souhaitez.
Les tableaux en C sont effectivement des pointeurs, mais des pointeurs constants, ce qui signifie qu'après la déclaration, leurs valeurs ne peuvent pas être modifiées.
int arr[] = {1, 2, 3};
// arr is declared as const pointer.
(arr + 1)
est possible mais arr++
n'est pas possible car arr
ne peut pas stocker une autre adresse car elle est constante.
char x[10];
char y[] = "Hello";
char *p_x = &x[0];
char *p_y = &y[0];
while(*p_y != '\0') *p_x++ = *p_y++;
Puisque vous ne pouvez pas modifier les adresses du tableau (faites par x++
et y++
dans votre code) et que vous pouvez modifier l'adresse du pointeur, j'ai copié l'adresse du tableau dans des pointeurs séparés et puis les a incrémentés .
Si vous voulez, je suis sûr que vous pouvez réduire la notation, mais j'espère que vous avez compris.
x
et y
sont des tableaux, pas des pointeurs.
Ils se décomposent en pointeurs dans la plupart des contextes d'expression, tels que votre expression d'incrémentation, mais ils se décomposent en valeurs et non en valeurs et vous pouvez uniquement appliquer des opérateurs d'incrémentation aux valeurs.
Puisque vous avez défini à la fois x
et y
en tant que tableaux, vous ne pouvez pas les modifier. Une possibilité serait d'utiliser des pointeurs à la place:
char x[10];
char *xx = x;
char *y = "Hello";
while (*y != '\0')
*xx++ = *y++;
Notez que j'ai également corrigé votre condition de fin - un pointeur ne deviendra pas NULL
simplement parce qu'il a atteint la fin d'une chaîne.
Dans la plupart des cas, les tableaux sont comme un pointeur.
Rappelez-vous que vous ne pouvez pas modifier le tableau!
Et y++
est y = y + 1
.
char y[] = "Hello";
Donc, vous modifiez un tableau lorsque vous y++
!!
Il produira error: lvalue required as increment operand
.
Nous ne pouvons pas modifier un nom de tableau, mais qu'en est-il de argv++
dans f(int argv[])
?
Citations de K & R dans p99 “un nom de tableau n'est pas une variable; Les constructions telles que a = pa
et a++
sont illégales "qui dit que le nom d'un tableau est synonyme de l'emplacement de l'élément initial."
Mais pourquoi dans le paramètre de fonction func(char *argv[])
, nous pouvons faire argv++
malgré que argv
soit un nom de tableau.
Et dans int *a[10]
, nous ne pouvons pas faire le a++
comme argv++
.
Le nom du tableau est un synonyme de l'emplacement de l'élément initial. --- K & R
arrayname++
est illégal.
Dans le paramètre de fonction, tel que char *argv[]
, il est identique à char **argv
. type *arrayname_para[]
en paramètre est un autre synonyme de type **arrayname_para
.