虽然以上答案已经解决了问题,但我确实想念为什么...因此,也许是一个经验法则:将const总是指它的前身令牌。如果没有这种情况,它是“ consting”它是后继令牌。该规则确实可以帮助您声明一个指向const指针的指针或类似的东西。无论如何,考虑到这一点,应该弄清楚为什么struct Person *const person = NULL;声明一个指向可变结构的const指针。考虑一下,您的typedef 使用指针标记将“分组”。所以,写struct Person*const PersonRef person = NULL;您的编译器会看到以下内容(伪代码):const [struct Person *]person = NULL;由于的内容已不const剩,因此它将令牌标记为正确的struct Person *常量。好吧,我认为,这就是为什么我不喜欢使用typedef隐藏指针的原因,而我确实喜欢typedef。那写作呢typedef struct Person { ... } Person;const Person *person; /*< const person */Person *const pointer; /*< const pointer to mutable person */对于编译器和人员来说,您应该做什么很清楚。
永远不要将指针隐藏在typedef后面,这确实是一种糟糕的做法,只会造成bug。此类臭名昭著的错误是,声明为const的typedef:ed指针类型将被视为“指向非常量数据的常量指针”,而不是“直观地希望指向常量数据的非常量指针”。 。这就是程序中发生的情况。解:typedef struct{ int age;} Person;const Person* person = NULL; // non-constant pointer to constant Person