Я часто вижу следующее объявление функции:Дважды декларация Const
some_func(const unsigned char * const buffer)
{
}
Любой идею, почему сопы повторяются перед именем указателя?
Спасибо.
Я часто вижу следующее объявление функции:Дважды декларация Const
some_func(const unsigned char * const buffer)
{
}
Любой идею, почему сопы повторяются перед именем указателя?
Спасибо.
Первый 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 Но могу ли я предложить добавить примеры, демонстрирующие, что константные указатели не могут быть переназначены. (т. е. 'char * const x = NULL; x = & some_char;') – Eric
@ Эрик Я считаю, что я уже включил это 'b = & other_char; // error' – wich
Я считаю, что мне нужно уделять больше внимания :) Мои извинения – Eric
Это делает его константным указателем на значение const, а не изменчивым указателем на значение const или указатель const на изменяемое значение.
Это постоянный указатель на постоянный символ без знака. Вы не можете изменить указатель и то, на что оно указывает.
const * unsigned char const buffer
означает, что вы не можете изменить указатель buffer
или память, на которую указывает buffer
.
В заявлении, как const * const T
, первый const
(до *
) означает, что указатель указывает на является const
(т.е. это указатель на const T
). const
после *
означает, что указатель сам равен const
(т. Е. Не может быть изменен, чтобы указать на что-либо еще).
Несколько статей, которые помогут вам понять, константный корректность в C++:
Предполагая, что const unsigned char * const
Все правильно, что его указатель const на const unsigned char.
Типы С ++ читают в основном справа налево, если в дальнем левом углу отсутствуют какие-либо модификаторы, затем они читаются слева направо.
деклараций типа следует (?) Читать RTL. const
изменяет вещь слева от нее, но правило осложняется тем, что вы можете писать как const T
, так и T const
(они означают одно и то же).
T * const
является постоянным указателем на изменяемом TT & const
будет постоянной ссылкой на изменяемом T, кроме ссылки является постоянной по определениюT const *
является изменяемым указателем на постоянная ТT const &
является ссылка постоянная TT const * const
является постоянным указателем на постоянной ТСпасибо, совет по чтению RTL полезен для таких случаев. – SyBer
Он должен быть 'Const символ без знака * const' – wich
IIRC неподписанные символ сопзЬ * сопзЬ также действует –
Нет, вы не видите такие заявления«часто». Декларация, по сути, недействительна и, следовательно, не имеет смысла. Пожалуйста, будьте более осторожны при отправке кода с вашими вопросами. – AnT