Двойное объявление константы

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

some_func(const unsigned char * const buffer)
{

}

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

Спасибо.

12
задан SyBer 28 January 2010 в 19:33
поделиться

8 ответов

Первая 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
21
ответ дан 2 December 2019 в 03:43
поделиться

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

3
ответ дан 2 December 2019 в 03:43
поделиться

Каждый стиль имеет некоторые недостатки, но я предпочитаю, который вы указали. Путь включения не должен содержать любую восходящую способность (например, .. ... .. ) и должен указывать модуль, на котором он опирается.

-121--3653524-

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

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

Типы C ++ Читайте в основном вправо налево , если нет никаких модификаторов в дальнем левом углу, то эти чтения слева направо.

2
ответ дан 2 December 2019 в 03:43
поделиться

Это делает его указателем Const на значение const, а не смежную указатель на значение const или constister на союзную ценность.

1
ответ дан 2 December 2019 в 03:43
поделиться

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

1
ответ дан 2 December 2019 в 03:43
поделиться

Const * unsigned Char Const Buffer означает, что вы не можете изменить указатель буфера , ни память, который буфер указывает на.

1
ответ дан 2 December 2019 в 03:43
поделиться

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

  • T * const - это постоянный указатель на изменяемый T
  • T & const будет постоянной ссылкой на изменяемый T , за исключением того, что ссылки являются постоянными по определению
  • T const * - это изменяемый указатель на константу T
  • T const & - ссылка на константу T
  • T const * const - константа указатель на константу T
8
ответ дан 2 December 2019 в 03:43
поделиться

В таком декларации 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 (или, возможно, «выправляется», так как вы на самом деле читаете справа налево в этом случае).

3
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: