Объявление Double const

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

some_func(const unsigned char * const buffer)
{

}

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

Спасибо.

Ответ 1

Первый 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

Ответ 2

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

  • T * const - постоянный указатель на изменяемый T
  • T & const будет постоянной ссылкой на изменяемый T, за исключением того, что ссылки являются постоянными по определению
  • T const * является изменяемым указателем на константу T
  • T const & является ссылкой на константу T
  • T const * const - постоянный указатель на константу T

Ответ 3

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

Ответ 4

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

Вы можете прочитать объявление из объекта, объявленного наружу, поэтому const unsigned char * const buffer читается как: "буфер является константным указателем на константный беззнаковый символ" (вот почему const всегда должен помещаться после того, что он изменяет - с помощью прежде вы должны переставить вещи, чтобы составить предложение - с объявлением unsigned char const * const buffer перевод на английский язык прост и понятен (или, возможно, "прямолинейен", поскольку вы действительно читаете справа налево).

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Несколько статей, которые помогут вам понять корректность const в С++: