Подтвердить что ты не робот

Какое значение имеют множественные квалификаторы?

код:

const char* const* const* foo(int bar);

Я видел двойные константы, перед которыми также предотвращается модификация указателя. В первый раз я видел тройную созвездию в моей жизни. Интересно, что это за использование.

4b9b3361

Ответ 1

В вашем примере все, кроме верхнего уровня косвенности, все const квалифицированы.

const char            /* const qualified base level */
    *const            /* const qualified level 1 */
    *const            /* const qualified level 2 */
    *                 /* regular level 3 */
    foo(int bar);

foo - это функция, которая принимает аргумент int и возвращает обычный указатель.
Возвращаемый указатель указывает на const квалифицированный указатель
который, в свою очередь, указывает на другой const квалифицированный указатель
который указывает на const квалифицированный char

Ответ 2

Если у вас многоуровневый указатель, у вас есть несколько переменных указателя. Пример:

char*** foo;

открывается следующим образом:

| foo | pointer1 | pointer2 | string |
   |    ^     |    ^     |    ^
    \___/      \___/      \___/

Вы можете квалифицировать каждое из четырех местоположений в памяти как const, как в объявлении

const char *const *const *const foo;

Однако лучше не ставить трехзвездочного программиста.

Ответ 3

Ха - путаница вокруг const.

В принципе, если он квалифицирует указатель, то он немедленно применяется к указателю слева от него. Например:

char *const c;

делает c указателем только для чтения char, тогда как

const char *c;

Делает c указателем на только для чтения char, хотя вы можете изменить, где c указывает на.

Конечно, и указатель, и то, на что он указывает, можно сделать доступным только для чтения:

const char *const c;

Это делает c указателем только для чтения только для чтения char. С помощью предыдущего объявления вы можете изменить *c, но вы не можете изменить c (т.е. Вы не можете указать его на другое место). Во втором случае вы можете назначить c, но не *c, а с третьим, вы не можете изменить, на что указывает, и не можете изменить объект с указателем.

Это распространяется на несколько уровней косвенности. Для вашего случая вам может понадобиться перегруппировать ключевые слова const с соответствующим указателем, который они квалифицируют. В основном это проблема с пробелами, но она будет выглядеть следующим образом:

const char *const *const *foo(int bar);

Что делает foo возвращать указатель на указатель только для чтения указателю на чтение только для чтения char. Внимательно прочитайте это: обратите внимание, что данный фрагмент кода:

const char *const *const *ptr = foo(0);

Тогда вы знаете, что назначение ptr является законным, но любое другое назначение является незаконным, а именно, вы не можете назначать *ptr, **ptr и ***ptr.

Ответ 4

foo возвращает a pointer, который указывает на a constant pointer, который указывает на другой constant pointer, который указывает на a constant char. Посмотрите на спиральное правило.

int bar;
const char* const* const* ptr = foo(bar);

Таким образом, вы не можете изменить любой из *ptr или **ptr или ***ptr.