Quelle est la différence entre :
char * const
y
const char *
Quelle est la différence entre :
char * const
y
const char *
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
.
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.
@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...
@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.
@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.
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.
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.
4 votes
Duplicata possible de Quelle est la différence entre const int*, const int * const, et int const * ?
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.
1 votes
Il existe un autre char const* qui est le type de retour de exception::what()
2 votes
FAQ ISO C++ : Quelle est la différence entre "const X* p", "X* const p" et "const X* const p" ?