Lisez-le à l'envers...
-
int*
- pointeur vers int
-
int const *
- pointeur vers const int
-
int * const
- pointeur constant sur int
-
int const * const
- pointeur constant sur const int
Maintenant le premier const peut être de chaque côté du type donc :
-
const int *
== int const *
-
const int * const
== int const * const
Si vous voulez être vraiment fou, vous pouvez faire des choses comme ça :
-
int **
- pointeur vers pointeur vers int
-
int ** const
- un pointeur constant sur un pointeur sur un int
-
int * const *
- un pointeur sur un pointeur constant sur un int
-
int const **
- un pointeur sur un pointeur sur un const int
-
int * const * const
- un pointeur const. sur un pointeur const. sur un int.
- ...
Et pour s'assurer que nous sommes clairs sur la signification de const
const int* foo;
int *const bar; //note, you actually need to set the pointer
//here because you can't change it later ;)
foo
est un pointeur de variable vers une constante int. C'est-à-dire que vous changez ce que vous pointez mais pas la valeur que vous pointez. Le plus souvent, cela se produit avec les chaînes de caractères où l'on a un pointeur sur un fichier const char
. Vous pouvez changer la chaîne vers laquelle vous pointez mais vous ne pouvez pas changer le contenu de la chaîne. Ceci est important lorsque la chaîne elle-même se trouve dans le segment de données d'un programme et ne doit pas être modifiée.
bar
est un pointeur constant ou fixe vers une valeur qui peut être modifiée. C'est comme une référence, mais sans le sucre syntaxique supplémentaire. Pour cette raison, vous utilisez généralement une référence là où vous utiliseriez une balise T* const
sauf si vous devez autoriser les pointeurs nuls.