код:
const char* const* const* foo(int bar);
Я видел двойные константы, перед которыми также предотвращается модификация указателя. В первый раз я видел тройную созвездию в моей жизни. Интересно, что это за использование.
код:
const char* const* const* foo(int bar);
Я видел двойные константы, перед которыми также предотвращается модификация указателя. В первый раз я видел тройную созвездию в моей жизни. Интересно, что это за использование.
В вашем примере все, кроме верхнего уровня косвенности, все 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
возвращает a pointer
, который указывает на a constant pointer
, который указывает на другой constant pointer
, который указывает на a constant char
. Посмотрите на спиральное правило.
int bar;
const char* const* const* ptr = foo(bar);
Таким образом, вы не можете изменить любой из *ptr
или **ptr
или ***ptr
.