arr + 1
est en fait un pointeur vers le deuxième élément de la matrice (c - &arr[1]
).
Toutefois, cela ne signifie pas que vous pouvez en quelque sorte écrire que la valeur du pointeur de retour en arr
. Vous ne pouvez pas le faire pour au moins deux raisons.
Tout d'abord, arr
est un tableau de char
éléments, et non pas un pointeur. Il y a une évidente incompatibilité de type ici.
Deuxièmement, étant un tableau, arr
d'un non-modifiable lvalue. Vous ne pouvez pas modifier arr
lui-même, vous pouvez uniquement modifier ses éléments (cette distinction est quelque peu difficile à saisir, mais il est là).
Enfin, si l'on ignore le plus profond de subtilités et de se concentrer sur ce qui formellement se passe au niveau supérieur, en raison de la matrice de décomposition de type de votre expression est équivalente à
(char *) arr = (char *) arr + 1;
La mission est impossible, puisque la gauche est un résultat de [implicite] conversion de type. En C les conversions de type produisent toujours rvalues. Vous ne pouvez pas affecter de rvalues.
En d'autres termes, il n'est pas de l'arithmétique des pointeurs" qui a refusé ici. L'arithmétique des pointeurs est très bien. C'est ce que vous faites avec le résultat que l'arithmétique des pointeurs qui provoque l'erreur.