J’ai un paramètre const char arr [] que j’essaye de parcourir,
char *ptr; for (ptr= arr; *ptr!= '\0'; ptr++) /* some code*/
J’obtiens une erreur: l’affectation supprime les qualificatifs du type cible du pointeur
Est-ce que const char [] est traité différemment que non-const?
Remplacez la déclaration de * ptr par.
const char* ptr;
Le problème est que vous atsortingbuez essentiellement un caractère const * à un caractère *. Ceci est une violation de const puisque vous passez d’un const à un non-const.
Comme JaredPar l’a dit, changez la déclaration de ptr en
const char* ptr;
Et ça devrait marcher. Bien que cela paraisse surprenant (comment pouvez-vous itérer un pointeur const?), Vous dites en fait que le caractère pointé est const, pas le pointeur lui-même. En fait, il existe deux endroits différents où vous pouvez appliquer const (et / ou volatile) dans une déclaration de pointeur, chacune des 4 permutations ayant une signification légèrement différente. Voici les options:
char* ptr; // Both pointer & pointed-to value are non-const const char* ptr; // Pointed-to value is const, pointer is non-const char* const ptr; // Pointed-to value is non-const, pointer is const const char* const ptr; // Both pointer & pointed-to value are const.
Quelqu’un (je pense que Scott Meyers) a dit que vous devriez lire les déclarations de pointeur à l’envers, c’est-à-dire:
const char* const ptr;
… serait lu comme “ptr est un pointeur constant sur un caractère qui est constant”.
Bonne chance!
A dessiné
La déclaration const saisit tout ce qui se trouve à gauche. S’il n’y a rien, ça a l’air bien.
Pour les boucles d’interaction comme ci-dessus où vous ne vous souciez pas de la valeur renvoyée, vous devriez dire ++ptr
plutôt que ptr++
.
ptr++
signifie:
temp = *ptr; ++ptr; return temp;`
++ptr
signifie:
++ptr; return *ptr;
Pour les types primitifs, le compilateur appliquera cette optimisation mais ne le fera pas lors d’une itération sur des objects C ++. Vous devez donc vous habituer à l’écrire correctement.