Différence entre const char *, char const *, const char const * & chaîne de stockage

Tout d’abord, quelle est la différence entre:

(1) const char* (2) char const* (3) const char const* 

Je suis à peu près certain de comprendre tout à fait cela, mais j’aimerais que quelqu’un me donne une phrase pour chacun, en particulier, pour que cela me rest dans la tête. C’est une de ces choses qui me va bien jusqu’à ce que quelqu’un me mette sur la sellette et que ça devienne flou!

De plus, comment sont stockés les littéraux de chaîne par le compilateur? Ce n’est pas un devoir, je suis en train de repasser C pour des interviews au cas où quelqu’un s’en soucierait.

1 et 2 sont équivalents et spécifient le type d’un pointeur sur un caractère constant. Le pointeur lui-même n’est pas const. 3 est invalide, car il répète “const”. C’est comme dire const const int . L’ordre n’est pas pertinent, c’est donc comme dire int const int .

En C99, il est valide de répéter const comme ça. Mais en C ++, vous ne pouvez pas le répéter.

De plus, comment sont stockés les littéraux de chaîne par le compilateur?

Ils sont stockés de manière non spécifiée. Mais les compilateurs sont autorisés à les stocker dans une partie en lecture seule du programme. Donc, vous ne pouvez pas écrire dans des littéraux de chaîne. Vous avez la garantie qu’ils restront alloués pendant toute la durée de vie du programme (en d’autres termes, ils ont une durée de stockage statique).

Ce n’est pas un devoir, je suis en train de repasser C pour des interviews au cas où quelqu’un s’en soucierait.

Vous devez être conscient des différences subtiles entre C et C ++. En C99, comme expliqué ci-dessus, const const int est autorisé. En C89 et C ++, c’est interdit. En C ++, vous pouvez cependant introduire un const redondant, s’il est appliqué à un typedef qui est lui-même const:

 typedef int const cint; cint const a = 0; // this const is redundant! 

Il en va de même pour les parameters de modèle.

 (1) const char* (2) char const* 

Ceci est un pointeur (que vous pouvez modifier) ​​sur un caractère (ou plusieurs caractères) que vous ne pouvez pas modifier. En d’autres termes, tous les littéraux de chaîne.

 (3) const char const* 

Ceci est doublé. Je pense que tu essayais de passer à la troisième position:

 (4) const char * const 

qui est un pointeur que vous ne pouvez pas changer, à un caractère (ou à plusieurs caractères) que vous ne pouvez pas changer. Vous pouvez l’utiliser pour les pointeurs globaux vers des littéraux qui ne doivent pas être modifiés accidentellement.

Les littéraux de chaîne vont être (très probablement) regroupés juste après votre code, généralement dans un segment ou une section appelée “rodata”.

Il y a beaucoup de réponses correctes ici, mais vous aurez peut-être du mal à vous souvenir, voici une astuce pour mémoriser ceci:

1> lorsque const est à gauche de *, cela signifie que le pointeur pointe sur un object constant;

par exemple, const int * p signifie que l’int ne peut pas être modifié via le pointeur p

2> lorsque const est à droite de *, cela signifie que le pointeur est un pointeur const;

Par exemple, int * const p signifie que p est un pointeur constant qui ne peut pas être modifié.

BTW si vous avez const des deux côtés de *, cela signifie alors que c’est un pointeur const et que vous ne pouvez pas modifier l’object via le pointeur.

par exemple, int const * const p

  • const char * et char const * ont la même signification: la valeur indiquée est const, mais le pointeur lui-même peut être remplacé par une autre adresse. Après initialisation, *p = 'X'; est invalide (ne comstack pas), et p = &x; (où x est une variable de type char ) est valide (il comstack).

  • Donc, const char const * indique deux fois la même chose.

  • char * const : la valeur pointée peut être modifiée, mais le pointeur lui-même est const. Il ne peut pas être modifié pour indiquer une autre adresse. Après initialisation, *p = 'X'; est valide, et p = &x; n’est pas.

  • const char * const et char const * const ont la même signification: la valeur pointée et le pointeur sont tous deux const. Ni *p = 'X'; ni p = &x; sont valides après l’initialisation.

  1. const char* signifie un pointeur sur un caractère constant
  2. char const* signifie exactement la même chose que 1. (vous vouliez probablement char* const , ce qui est un pointeur constant sur un caractère.)
  3. const char const* n’est pas valide comme l’a déjà souligné Johannes

Les littéraux de chaîne sont généralement stockés dans un segment de données en lecture seule de votre exécutable, mais cela n’est en aucun cas garanti.

  1. const char * Pointeur sur les données de caractère constant (lire de droite à gauche).

  2. Identique à # 1.

  3. const char * const Pointeur constant (le pointeur ne peut pas être changé) en données constantes (les données ne peuvent pas être modifiées).

  4. Les littéraux de chaîne sont stockés dans la mémoire en lecture seule, généralement tels quels, et se terminent par un ‘\ 0’. Ce sont des pointeurs constants vers des données constantes.