Обозначение указателя C ++ - PullRequest
0 голосов
/ 30 августа 2018

Итак, я сейчас изучаю C ++, и я только начал изучать Pointers, и я думал, что буду хорошо понимать семантику, пока я не увидел это в одном из рекомендуемых решений упражнения в Книге, с которой я учусь. :

const char* sa = * ( static_cast < const char* const* > (a));

Я все понимаю, кроме const* в параметре типа. Почему он там, что он делает?

РЕДАКТИРОВАТЬ: исправлена ​​неясная формулировка

1 Ответ

0 голосов
/ 30 августа 2018

* в типе означает, что тип является указателем на тип в левой части звездочки.

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
...