*
в типе означает, что тип является указателем на тип в левой части звездочки.
const
в типе означает, что тип слева от const
является константой. Для объекта const
означает, что значение не может быть изменено. Для справки const
означает, что объект не может быть изменен посредством ссылки.
char
- это тип, представляющий целочисленный кодированный объект узкого символа.
const char
является константой char
.
const char*
- указатель на const char
.
const char* const
- это указатель const
на const char
.
const char* const*
- указатель на const char* const
.
Обратите внимание, что указатель является косвенным:
* ( static_cast < const char* const* > (a));
^ indirection operator
Когда указатель перенаправлен, результатом является ссылка (lvalue) на указанный объект. Если бы const char*
было перенаправлено, результирующее lvalue будет иметь тип const char
. Очевидно, что такое lvalue нельзя использовать для инициализации объекта const char* sa
.
Когда const char* const*
является косвенным, результатом будет ссылка (lvalue) на объект типа const char* const
. Такое значение можно использовать для инициализации const char* sa
.
Более простой пример без приведений:
const char c; // c cannot be modified
const char* const a = &c; // a points to charcter object c
// a cannot be modified
const char* sa = *a; // sa points to a as well
sa = nullptr; // sa can be modified; it no longer points to a