Хотя проблема уже решена ответами выше, я скучаю по причине, почему ...
Так, может быть, как правило:
-
const
всегда ссылается на маркер своего предшественника.
- В случае, если такого не существует, вместо этого он "создает" свой токен-преемник.
Это правило действительно может помочь вам объявить указатель на константные указатели или что-то такое же аккуратное.
В любом случае, имея это в виду, должно быть понятно, почему
struct Person *const person = NULL;
объявляет константный указатель на изменчивую структуру.
Подумайте об этом, ваш typedef "группы" struct Person
с маркером указателя *
.
Итак, для написания
const PersonRef person = NULL;
ваш компилятор видит что-то подобное (псевдокод):
const [struct Person *]person = NULL;
Так как слева от const
ничего нет, он декларирует токен вправо struct Person *
константа.
Ну, я думаю, это причина, почему я не люблю скрывать указатели с помощью typedefs, а мне нравятся typedefs как таковые. Как насчет письма
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
и компиляторам и людям должно быть совершенно ясно, чем вы занимаетесь.