2010-01-28 6 views
8

Je vois souvent la déclaration de fonction suivante:déclaration Double const

some_func(const unsigned char * const buffer) 
{ 

} 

Toute idée pourquoi le const est répété avant le nom du pointeur?

Merci.

+0

Il devrait être 'const unsigned char * const' – wich

+3

IIRC unsigned char const * const est également valable –

+0

Non, vous ne voyez pas ces déclarations "souvent". La déclaration est, en fait, invalide et n'a donc aucun sens. S'il vous plaît, soyez plus prudent lorsque vous postez du code avec vos questions. – AnT

Répondre

17

Le premier const dit que les données pointé est constante et ne peuvent pas être modifiés , le deuxième dit que le pointeur lui-même ne peut pas être changé:

char my_char = 'z'; 
const char* a = &my_char; 
char* const b = &my_char; 
const char* const c = &my_char; 

a = &other_char; //fine 
*a = 'c'; //error 
b = &other_char; //error 
*b = 'c'; //fine 
c = &other_char; //error 
*c = 'c'; //error 
+1

+1 Mais pourrais-je suggérer d'ajouter des exemples démontrant que les pointeurs const ne peuvent pas être réaffectés. (c'est-à-dire, 'char * const x = NULL; x = & some_char;') – Eric

+0

@Eric Je crois que j'ai déjà inclus que 'b = & other_char; // erreur' – wich

+0

Je crois que je dois faire plus attention :) Mes excuses – Eric

1

Cela en fait un pointeur const à une valeur const, plutôt qu'un pointeur mutable à une valeur const ou un pointeur const à une valeur mutable.

3

Il est un pointeur constant à un unsigned char constant. Vous ne pouvez pas changer le pointeur ni la chose vers laquelle il pointe.

1

const * unsigned char const buffer signifie que vous ne pouvez pas modifier le pointeur buffer ni la mémoire vers laquelle buffer pointe.

2

Dans une déclaration comme const * const T, la première const (avant le *) signifie que ce que les points de pointeur à est-const (à savoir qu'il est un pointeur vers un const T). Le const après le * signifie que le pointeur se est const (ce ne peut pas être modifié pour pointer à quoi que ce soit d'autre).

2

En supposant const non signé char * const

Tout le monde a raison de dire que c'est un pointeur const vers un caractère const non signé.

Les types C++ lisent généralement de droite à gauche à moins qu'il n'y ait des modificateurs à l'extrême gauche, puis ceux-ci sont lus de gauche à droite.

7

déclarations de type doivent (?) Lire RTL. const modifie la chose à sa gauche, mais la règle est compliquée par le fait que vous pouvez écrire à la fois const T et T const (ils signifient la même chose).

  • T * const est un pointeur constant à mutable T
  • T & const serait référence constante à mutable T, à l'exception des références sont constants par définition
  • T const * est un pointeur mutable à T
  • constante
  • T const & est une référence à la constante T
  • T const * const est constante pointeur à T constante
+0

Merci, le conseil de lecture RTL est utile pour de tels cas. – SyBer