363 votes

Quelle est la différence entre char * const et const char * ?

Quelle est la différence entre :

char * const 

y

const char *

4 votes

15 votes

La première chose à gauche de "const" est ce qui est constant. Si "const" est la chose la plus à gauche, alors la première chose à sa droite est ce qui est constant.

9 votes

Un conseil d'ami, n'oubliez jamais que cdecl est une chose.

453voto

workmad3 Points 12974

La différence est que const char * est un pointeur vers un const char alors que char * const est un pointeur constant vers un char .

La première, la valeur pointée ne peut pas être modifiée mais le pointeur peut l'être. Dans le second cas, la valeur pointée peut changer mais pas le pointeur (comme une référence).

Il existe également un

const char * const

qui est un pointeur constant vers un caractère constant (donc rien ne peut être modifié).

Note :

Les deux formulaires suivants sont équivalents :

const char *

y

char const *

La raison exacte de ce phénomène est décrite dans la norme C++, mais il est important de le noter et d'éviter la confusion. Je connais plusieurs normes de codage qui préfèrent :

char const

sur

const char

(avec ou sans pointeur) de manière à ce que le placement de l'élément const est identique à celle d'un pointeur const .

9 votes

Serait-il utile de noter ce qui se passe si plusieurs variables sont spécifiées dans la même déclaration ? Je crois const int *foo,*bar; déclarerait à la fois foo y bar à être int const * mais int const *foo, *bar déclarerait foo pour être un int const * y bar à être int * . Je pense typedef int * intptr; const intptr foo,bar; déclarerait les deux variables comme étant int * const ; je ne connais aucun moyen d'utiliser une déclaration combinée pour créer deux variables de ce type sans typedef.

2 votes

@supercat I believe const int *foo,*bar; would declare both foo and bar to be int const * : Oui. but int const *foo, *bar would declare foo to be a int const * and bar to be int * : Non ! Ce serait exactement la même chose que dans le cas précédent. (Voir ideone.com/RsaB7n où vous obtenez la même erreur pour foo et bar). I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const : Oui. I don't know any way to use a combined declaration to create two variables of that type without a typedef : Eh bien, int *const foo, *const bar; . La syntaxe du déclarateur C...

0 votes

@gx_ : J'avais donc tort - mon incertitude était la raison pour laquelle j'ai suggéré qu'il pourrait être utile de dire quelles sont les règles. Ce qui serait int const *foo, *volatile bar faire pour bar ? Faites les deux. const y volatile ? La séparation nette des noms de variables déclarées et de leurs types me manque dans Pascal (un pointeur vers un tableau de pointeurs vers des entiers serait var foo: ^Array[3..4] of ^Integer ;`. Ce serait un drôle de truc de parenthèses imbriquées en C, je pense.

137voto

diapir Points 1017

Pour éviter toute confusion, il faut toujours ajouter le qualificatif const.

int       *      mutable_pointer_to_mutable_int;
int const *      mutable_pointer_to_constant_int;
int       *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;

12 votes

Pourquoi ? "Pour éviter toute confusion" n'explique pas ce qu'est la confusion pour moi.

24 votes

@Andrew : Je faisais allusion à la cohérence et donc à la lisibilité. Écrire tous les qualificatifs de type de façon à ce qu'ils modifient ce qui est à leur gauche, toujours est ce que j'utilise.

3 votes

En fait, c'est la meilleure réponse que j'aie trouvée sur le sujet dans SO

62voto

Don McCaughey Points 4433

const modifie toujours la chose qui la précède (à sa gauche), SAUF lorsqu'elle est la première chose dans une déclaration de type, où elle modifie la chose qui la suit (à sa droite).

Donc ces deux-là sont les mêmes :

int const *i1;
const int *i2;

ils définissent des pointeurs vers un const int . Vous pouvez modifier l'endroit où i1 y i2 des points, mais vous ne pouvez pas changer la valeur qu'ils désignent.

Ceci :

int *const i3 = (int*) 0x12345678;

définit un const à un entier et l'initialise pour qu'il pointe à l'emplacement mémoire 12345678. Vous pouvez modifier le int à l'adresse 12345678, mais vous ne pouvez pas changer l'adresse qui i3 pointe vers.

27voto

Andrew Coleson Points 3159

const char* est un pointeur vers un caractère constant
char* const est un pointeur constant vers un caractère
const char* const est un pointeur constant vers un caractère constant

23voto

Adam Rosenfield Points 176408

const * char est un code C invalide et n'a aucun sens. Peut-être vouliez-vous demander la différence entre un const char * et un char const * ou peut-être la différence entre un const char * et un char * const ?

Voir aussi :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X