Trong khi vấn đề đã được giải quyết bằng các câu trả lời ở trên, tôi làm lỡ lý do tại sao ...
Vì vậy, có lẽ như một quy luật của:
- Các
const
luôn đề cập đến nó là người tiền nhiệm của thẻ.
- Trong trường hợp không có, thay vào đó, "sắp xếp" đó là mã thông báo kế thừa.
Quy tắc này thực sự có thể giúp bạn để khai báo con trỏ tới con trỏ const hoặc thứ gì đó gọn gàng như nhau.
Dù sao, với điều này trong tâm trí, nó sẽ nhận được rõ ràng lý do tại sao
struct Person *const person = NULL;
khai báo một con trỏ const đến một cấu trúc có thể thay đổi.
Hãy nghĩ về điều đó, typedef "nhóm" của bạn struct Person
bằng mã thông báo con trỏ *
. Vì vậy, để viết
const PersonRef person = NULL;
trình biên dịch của bạn thấy một cái gì đó như thế này (pseudo-code):
const [struct Person *]person = NULL;
Như không có gì để const
's trái là, nó deklares token để nó ở ngay struct Person *
liên tục.
Vâng tôi nghĩ, đây là lý do tại sao tôi không thích ẩn con trỏ bởi typedefs, trong khi tôi làm như typedefs như vậy. Điều gì về cách viết
typedef struct Person { ... } Person;
const Person *person; /*< const person */
Person *const pointer; /*< const pointer to mutable person */
và nó phải khá rõ ràng với trình biên dịch và con người, những gì bạn đang làm.
"Nhưng từ khóa const không được tạo thành con trỏ const." Huh? Câu trả lời ngắn: không sử dụng typedefs, chúng chỉ ở đó để gây nhầm lẫn cho bạn. Hãy nhớ chúng cho đến khi bạn cần chúng. – wildplasser
@wildplasser: "Không sử dụng typedef" không phải là lời khuyên tốt. Có lẽ "Đừng giấu con trỏ đằng sau typedefs" là thích hợp hơn ... –
Tôi cầu xin sự khác biệt. Nó * là * một lời khuyên tốt. Ẩn cấu trúc đằng sau một typedef chỉ là khó hiểu như ẩn con trỏ. Nó chỉ phục vụ để gây ô nhiễm không gian tên tinh thần của bạn. Ngay cả khi không có cú pháp tô sáng tôi đọc "struct person * p" dễ dàng hơn và nhanh hơn sau đó "pPerson p". – wildplasser