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

Код:

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

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

4 ответа

Решение

В вашем примере все, кроме верхнего уровня косвенности все 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

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

char*** foo;

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

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

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

const char *const *const *const foo;

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

Ха - путаница вокруг 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,

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

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

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

Другие вопросы по тегам