Das Problem ist zwar durch die obigen Antworten bereits gelöst, aber ich vermisse den Grund dafür...
Also vielleicht als Faustregel:
- Le site
const
bezieht sich immer auf sein Vorgänger-Token.
- Falls es keine solche gibt, "konstituiert" sie stattdessen ihre Nachfolgemarke.
Diese Regel kann Ihnen wirklich helfen, wenn Sie einen Zeiger auf const-Zeiger oder etwas ähnlich Ordentliches deklarieren.
In Anbetracht dessen sollte klar werden, warum
struct Person *const person = NULL;
erklärt eine konstanter Zeiger zu einer veränderbaren Struktur.
Denken Sie darüber nach, dass Ihr typedef "Gruppen" die struct Person
mit dem Zeiger-Token *
. Also, zum Schreiben
const PersonRef person = NULL;
sieht Ihr Compiler etwa so aus (Pseudocode):
const [struct Person *]person = NULL;
Da es nichts zu tun gibt const
links, deklariert es die Spielmarke rechts davon struct Person *
の定数です。
Nun, ich denke, das ist der Grund, warum ich es nicht mag, Zeiger durch Typendefinitionen zu verstecken, während ich Typendefinitionen als solche sehr wohl mag. Was ist mit dem Schreiben von
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
und es sollte für Compiler und Menschen ziemlich klar sein, was Sie vorhaben.