Đọc từ phải sang trái: "const" gần nhất áp dụng cho phần tử đứng trước nó.
cpp
const int* p; // pointer to const int — địa chỉ có thể đổi, *p không đổi được
int* const p; // const pointer to int — địa chỉ không đổi, *p đổi được
const int* const p; // const pointer to const int — cả hai đều không đổiVí dụ thực tế:
cpp
int x = 1, y = 2;
const int* p1 = &x;
// *p1 = 10; // lỗi — giá trị không sửa được
p1 = &y; // OK — pointer có thể trỏ chỗ khác
int* const p2 = &x;
*p2 = 10; // OK — giá trị sửa được
// p2 = &y; // lỗi — pointer không trỏ lại đượcHình dung: const trước = bảo vệ dữ liệu; const sau = bảo vệ địa chỉ.
Read right-to-left: the nearest const applies to the element immediately before it.
cpp
const int* p; // pointer to const int — address changeable, *p immutable
int* const p; // const pointer to int — address immutable, *p changeable
const int* const p; // const pointer to const int — both immutablePractical example:
cpp
int x = 1, y = 2;
const int* p1 = &x;
// *p1 = 10; // error — value is read-only
p1 = &y; // OK — pointer can be retargeted
int* const p2 = &x;
*p2 = 10; // OK — value is writable
// p2 = &y; // error — pointer cannot be retargetedMental model: const before = protect the data; const after = protect the address.