2010-01-28 3 views
8

Я часто вижу следующее объявление функции:Дважды декларация Const

some_func(const unsigned char * const buffer) 
{ 

} 

Любой идею, почему сопы повторяются перед именем указателя?

Спасибо.

+0

Он должен быть 'Const символ без знака * const' – wich

+3

IIRC неподписанные символ сопзЬ * сопзЬ также действует –

+0

Нет, вы не видите такие заявления«часто». Декларация, по сути, недействительна и, следовательно, не имеет смысла. Пожалуйста, будьте более осторожны при отправке кода с вашими вопросами. – AnT

ответ

17

Первый Const говорит, что данные указывают на постоянный и не может быть изменен , второй говорит, что сам указатель не может быть изменен:

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 Но могу ли я предложить добавить примеры, демонстрирующие, что константные указатели не могут быть переназначены. (т. е. 'char * const x = NULL; x = & some_char;') – Eric

+0

@ Эрик Я считаю, что я уже включил это 'b = & other_char; // error' – wich

+0

Я считаю, что мне нужно уделять больше внимания :) Мои извинения – Eric

1

Это делает его константным указателем на значение const, а не изменчивым указателем на значение const или указатель const на изменяемое значение.

3

Это постоянный указатель на постоянный символ без знака. Вы не можете изменить указатель и то, на что оно указывает.

1

const * unsigned char const buffer означает, что вы не можете изменить указатель buffer или память, на которую указывает buffer.

2

В заявлении, как const * const T, первый const (до *) означает, что указатель указывает на является const (т.е. это указатель на const T). const после * означает, что указатель сам равен const (т. Е. Не может быть изменен, чтобы указать на что-либо еще).

2

Предполагая, что const unsigned char * const

Все правильно, что его указатель const на const unsigned char.

Типы С ++ читают в основном справа налево, если в дальнем левом углу отсутствуют какие-либо модификаторы, затем они читаются слева направо.

7

деклараций типа следует (?) Читать RTL. const изменяет вещь слева от нее, но правило осложняется тем, что вы можете писать как const T, так и T const (они означают одно и то же).

  • T * const является постоянным указателем на изменяемом T
  • T & const будет постоянной ссылкой на изменяемом T, кроме ссылки является постоянной по определению
  • T const * является изменяемым указателем на постоянная Т
  • T const & является ссылка постоянная T
  • T const * constявляется постоянным указателем на постоянной Т
+0

Спасибо, совет по чтению RTL полезен для таких случаев. – SyBer

Смежные вопросы