Что означает множественные квалификаторы 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
,