Я часто вижу следующее объявление функции:
some_func(const unsigned char * const buffer)
{
}
Любая идея, почему константа повторяется перед именем указателя?
Спасибо.
Я часто вижу следующее объявление функции:
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
объявления типа должны (?) быть прочитаны RTL. const
изменяет вещь слева, но правило осложняется тем, что вы можете писать как const T
, так и T const
(они означают одно и то же).
T * const
- постоянный указатель на изменяемый TT & const
будет постоянной ссылкой на изменяемый T, за исключением того, что ссылки являются постоянными по определениюT const *
является изменяемым указателем на константу TT const &
является ссылкой на константу TT const * const
- постоянный указатель на константу TЭто постоянный указатель на константу unsigned char. Вы не можете изменить указатель и то, на что оно указывает.
В объявлении, подобном const * const T
, первый const
(перед *
) означает, что указатель указывает на const
(т.е. это указатель на const T
). const
после *
означает, что указатель сам по себе является const
(то есть не может быть изменен, чтобы указывать на что-либо еще).
Вы можете прочитать объявление из объекта, объявленного наружу, поэтому const unsigned char * const buffer
читается как: "буфер является константным указателем на константный беззнаковый символ" (вот почему const
всегда должен помещаться после того, что он изменяет - с помощью прежде вы должны переставить вещи, чтобы составить предложение - с объявлением unsigned char const * const buffer
перевод на английский язык прост и понятен (или, возможно, "прямолинейен", поскольку вы действительно читаете справа налево).
Предполагая, что const unsigned char * const
Все правильно, что его const-указатель на const unsigned char.
Типы С++ читают в основном справа налево, если в дальнем левом углу нет никаких модификаторов, затем они читаются слева направо.
Это делает его константным указателем на значение const, а не изменчивым указателем на значение const или указателем const на изменяемое значение.
const * unsigned char const buffer
означает, что вы не можете изменить указатель buffer
или память, на которую указывает buffer
.
Несколько статей, которые помогут вам понять корректность const в С++: