const char* et char const* - sont-ils les mêmes?

d'après ce que j'ai compris, const les modificateurs doivent être lus de droite à gauche. De là, je comprends:

const char*

est un pointeur dont les éléments de char ne peuvent pas être modifiés, mais le pointeur lui-même peut, et

char const*

est un pointeur constant vers mutable .

Mais j'obtiens les erreurs suivantes pour le code suivant:

const char* x = new char[20];
x = new char[30];   //this works, as expected
x[0] = 'a';         //gives an error as expected

char const* y = new char[20];
y = new char[20];   //this works, although the pointer should be const (right?)
y[0] = 'a';         //this doesn't although I expect it to work

So... qui est-ce? Est mon comprendre ou mon compilateur (VS 2005) faux?

78
demandé sur Puppy 2011-11-11 13:10:02

6 réponses

en Fait, selon la norme, const modifie l'élément directement à sa gauche . L'utilisation de const au début d'une déclaration est juste une pratique mentale raccourci. Ainsi, les deux énoncés suivants sont équivalents:

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

afin d'assurer le pointeur lui-même n'est pas modifié, const doit être placé après l'astérisque:

char * const constantPointerToMutableContent;

pour protéger À la fois le pointeur et le contenu qu'il pointe, utilisez deux consts.

char const * const constantPointerToConstantContent;

j'ai personnellement adopté toujours mettre la const après la partie, j'ai l'intention de ne pas modifier ce que j'ai de maintenir la cohérence même lorsque le pointeur est la partie que je souhaite garder constante.

125
répondu Greyson 2012-05-03 21:46:11

ça marche parce que les deux sont identiques. Cents cinquante et une million neuf cent quarante mille neuf cent vingt"

const char*  // both are same
char const*

et

char* const  // unmutable pointer to "char"

et

const char* const  // unmutable pointer to "const char"

[pour se rappeler ceci, voici une règle simple, ' * 'affecte son tout LHS premier ]

29
répondu iammilind 2011-11-11 09:41:24

c'est parce que la règle est:

règle: const se lie à gauche, sauf s'il n'y a rien à gauche, alors il se lie à droite :)

donc, regardez-les comme:

(const --->> char)*
(char <<--- const)*

pareil! oh, et --->> et <<--- ne sont pas des opérateurs, ils montrent juste à quoi le const se lie.

24
répondu Akanksh 2011-11-11 09:27:48

(de 2 simple variable d'initialisation question )

Une très bonne règle de base concernant les const :

lire les déclarations de droite à gauche.

(voir Vandevoorde/Josutiss "Modèles C++: Le Guide Complet")

par exemple:

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

depuis que j'ai suivi cette règle empirique, Je Je n'ai plus jamais mal interprété de telles déclarations.

(: sisab retcarahc-rep a pas des tonnes ,sisab nekot-rep a pas de tfel-ot-thgir naem je hguohT :la marée

11
répondu Sebastian Mach 2017-05-23 11:54:59

Voici comment j'essaie toujours d'interpréter:

char *p

     |_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".

char * const p

     |_____ again start from the asterisk. "content of constant (since we have the `const` 
            modifier in the front) `p` is a `char`".

char const *p

           |_____ again start from the asterisk. "content of `p` is a constant `char`".

Espère que cela aide!

5
répondu yasouser 2011-11-18 02:57:58

dans vos deux cas, vous pointez un char constant.

const char * x  //(1) a variable pointer to a constant char
char const * x  //(2) a variable pointer to a constant char
char * const x  //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?

Par défaut const s'applique à ce qui est immédiatement à gauche, mais il pourrait s'appliquer à ce qui est immédiatement à sa droite, si il n'y a rien qui précèdent, comme dans (1).

0
répondu Lino Mediavilla 2017-10-29 23:39:17