Я часто вижу следующее объявление функции:
some_func(const unsigned char * const buffer)
{
}
Какая-либо идея, почему константа повторяется перед именем указателя?
Спасибо.
Первая const
говорит, что указанные данные являются константными и не могут быть изменены, в то время как вторая 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
Это постоянный указатель на постоянную не подписанную символ. Вы не можете изменить указатель, ни то, что он указывает.
Каждый стиль имеет некоторые недостатки, но я предпочитаю, который вы указали. Путь включения не должен содержать любую восходящую способность (например, .. ... ..
) и должен указывать модуль, на котором он опирается.
Предполагая, что const unsigned char * const
, все правильно, что его const указатель на const unsigned char.
Типы C ++ Читайте в основном вправо налево , если нет никаких модификаторов в дальнем левом углу, то эти чтения слева направо.
Это делает его указателем Const на значение const, а не смежную указатель на значение const или constister на союзную ценность.
Пара статей, которые помогут вам понять const корректность на С++:
Const * unsigned Char Const Buffer
означает, что вы не можете изменить указатель буфера
, ни память, который буфер
указывает на.
объявления типа следует (?) Читать RTL. const
изменяет объект слева, но правило усложняется тем фактом, что вы можете записать как const T
, так и T const
(они означают одно и то же ).
T * const
- это постоянный указатель на изменяемый T T & const
будет постоянной ссылкой на изменяемый T , за исключением того, что ссылки являются постоянными по определению T const *
- это изменяемый указатель на константу T T const &
- ссылка на константу T T const * const
- константа указатель на константу T В таком декларации const * const t
, первая const
(до *
) означает то, что точки указателя на - это const
(т.е. это указатель на const t
). const
после *
означает, что сама указатель const
(то есть не может быть изменена, чтобы указать на что-либо еще).
Вы можете прочитать декларацию от объявленного объекта Outward, поэтому Const unsigned Char * Const Buffer
читается как: «Буфер - указатель константа на Const unsigned Char» (вот почему const
всегда должен быть размещен после , что он изменяет - с ним раньше вы должны переставить вещи, чтобы сделать предложение - с ним объявлено unsigned Char Const * Const Buffer
, Перевод на английский прост и reaighforward (или, возможно, «выправляется», так как вы на самом деле читаете справа налево в этом случае).