Почему это указатель const, а не указатель на const? - PullRequest
0 голосов
/ 27 марта 2019

В книге C ++ Primer есть объяснение псевдонимов типа:

typedef char *pstring;
const pstring cstr = 0; // cstr is a constant pointer to char

Они говорят, что следующее неверное толкование:

const char *cstr = 0;

Однако для меня имеет смысл заменить псевдоним typedef его первоначальным значением.

В обычном сценарии без наложения типа постоянный указатель определяется как:

char *const cstr = 0;

Почему это константный указатель, а не указатель на const?

Может кто-нибудь объяснить в ясных терминах, потому что книга, кажется, не проясняет это много.

1 Ответ

2 голосов
/ 27 марта 2019

2 * 3 + 1 равно 7. Но как получится, если я сделаю int i = 3 + 1;, а затем 2 * i даст 8? Разве переменная не должна быть заменена ее первоначальным значением?

Это потому, что 2 * 3 + 1 интерпретируется как (2 * 3) + 1, а 2 * i совпадает с 2 * (3 + 1). Они означают разные вещи и работают на разные номера. Когда вы даете 3 + 1 имя, когда вы используете имя, оно не разбивает число обратно на 3 + 1, чтобы только умножить 3.

Причина, по которой const char * отличается от const pstring, очень похожа. const char * интерпретируется как (const char) *, то есть указатель на постоянный символ. Но const pstring - это то же самое, что и const (char *), то есть постоянный указатель на символ. pstring сам по себе является целым типом, и когда вы делаете const pstring, он не разделяет char *, чтобы сделать char часть постоянной.

Примечание: если вы сделали #define pstring char *, то const pstring будет таким же, как const char *, потому что макросы (#define s) просто обрабатываются как замены текста.

...