Erreur «lvalue requirejse» lors de la tentative d’incrémentation d’un tableau

Dupliquer possible:
Est-ce que le nom du tableau est un pointeur en C?

Supposons que j’ai un tableau de caractères disant que arr et arr représenteront l’adresse du premier élément, donc arr ++ devrait être parfaitement légal, alors pourquoi le compilateur dit ‘lvalue required’.

Aussi, si je le fais: arr = arr + 1, alors pourquoi la conversion est invalide. J’augmente simplement le pointeur d’un point. Le compilateur indique que sur LHS, le type d’opérande est char [4] mais sur RHS, char *.

main() { char arr[]={'a','b','c','d'}; for(;arr!=arr+4;arr++) //lvalue required printf("%c",*arr); } 

Un nom de tableau n’est pas une variable pouvant être affectée. Si vous voulez le modifier, vous devriez utiliser une variable de pointeur:

 char *arr_ptr = arr; 

Vous pouvez alors faire arr_ptr++ et arr_ptr = arr_ptr+1 ;

Les tableaux ne sont pas des pointeurs. arr ne représente pas une adresse.

Un nom de tableau, ou toute expression de type tableau, est implicitement converti en un pointeur sur le premier élément du tableau, à moins que ce ne soit:

  • L’opérande d’une expression unaire & (address-of) (qui fournit l’adresse de l’ensemble du tableau, et non de son premier élément – même adresse mémoire, type différent); ou
  • L’opérande d’un opérateur sizeof ( sizeof arr donne la taille du tableau, pas la taille d’un pointeur); ou
  • _Alignof un opérateur _Alignof ( _Alignof arr donne l’alignement du tableau, pas l’alignement d’un pointeur); ou
  • Littéral de chaîne dans un initialiseur utilisé pour initialiser un object arrary.

_Alignof est nouveau en C2011.

(La conversion est souvent appelée “décomposition”.)

Aucune de celles-ci ne s’applique ici, donc arr++ essaie d’incrémenter un object pointeur. Le problème est qu’il n’y a pas d’ object de pointeur, juste une valeur de pointeur. arr , après sa décomposition en une valeur de pointeur, n’est pas une valeur, ce qui signifie qu’elle ne peut pas apparaître à gauche d’une affectation ou en tant qu’opérande de ++ .

De même, étant donné:

 int x; 

l’expression x est une valeur, vous pouvez donc écrire x = 42; – mais l’expression (x + 1) n’est pas une lvalue, vous ne pouvez donc pas écrire (x + 1) = 42; . Vous pouvez affecter à x car il fait référence à un object . (x+1) ne fait pas référence à un object, il n’y a donc rien à assigner. arr , après sa décomposition, ne fait pas non plus référence à un object (vous avez un object tableau, mais il n’y a pas d’object pointeur).

(Votre utilisation de arr != arr + 4 aurait dû être un indice; cela ne peut jamais être vrai.)

Plutôt que cela:

 char arr[] = {'a', 'b', 'c', 'd'}; for (; arr != arr + 4; arr++) { printf("%c", *arr); } 

vous pouvez écrire ceci:

 char arr[] = {'a', 'b', 'c', 'd'}; char *ptr; for (ptr = arr; ptr != arr + 4; ptr++) { printf("%c", &ptr); } 

Incidemment, en haut de votre programme, vous devriez changer ceci:

 main() 

pour ça:

 #include  int main(void) 

De plus, lancez, ne marchez pas, vers la FAQ comp.lang.c et lisez la section 6, “Tableaux et pointeurs”.