2008-11-02 6 views
1

J'ai un paramètre const char arr [] que je suis en train de parcourir,erreur C avec pointeur et const char []

char *ptr; 
for (ptr= arr; *ptr!= '\0'; ptr++) 
    /* some code*/ 

je reçois une erreur: attribution défausse de qualification de type pointeur cible

Est-ce que const char [] est géré différemment de non-const?

Répondre

11

Activer la déclaration de * ptr.

const char* ptr; 

Le problème est que vous attribuez essentiellement un char * à un caractère *. C'est une violation de const puisque vous passez d'un const à un non-const.

10

Comme l'a dit JaredPar, la déclaration de changement à ptr

const char* ptr; 

Et cela devrait fonctionner. Bien que cela semble surprenant (comment pouvez-vous itérer un pointeur const?), Vous êtes en train de dire que le caractère pointé est const, pas le pointeur lui-même. En fait, il existe deux endroits différents que vous pouvez appliquer const (et/ou volatile) dans une déclaration de pointeur, avec 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) dit que vous devriez lire les déclarations de pointeur dessus-dessous, à savoir:

const char* const ptr; 

... serait lu comme « ptr est un pointeur constant à un personnage qui est constant ".

Bonne chance!

Drew

+0

Merci, c'est utile. Maintenant, je dois juste me rappeler ce que cela signifie quand la méthode est marquée comme const ... –

0

La déclaration const saisit tout ce qui est à gauche. S'il n'y a rien, il semble juste.

0

Pour les boucles d'interactivité comme ci-dessus où vous ne vous souciez pas de la valeur renvoyée, vous devez indiquer ++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 pas quand itérer sur les objets C++ de sorte que vous devriez obtenir dans le habitude de l'écrire de la bonne façon.

Questions connexes