以《C++ Primer》為準,以編譯器語法為準。
網絡資料不一致源於**中文翻譯習慣混淆、教材版本差異、作者理解偏差**。英文原版術語完全明確:
// 1. 指向常量的指針 (Pointer to const) - 數據不可修改,指針可指向別處
const int* p1; // int const* p1; (等價)
// 讀法: p1 是一個 pointer,指向 const int
// p1 = &other; ✅ 合法
// *p1 = 10; ❌ 錯誤:不能通過 p1 修改數據
// 2. 常量指針 / 指針常量 (Const pointer) - 指針不可修改 (指向固定地址),數據可修改
int* const p2;
// 讀法: p2 是一個 const pointer,指向 int
// p2 = &other; ❌ 錯誤:不能修改指針指向
// *p2 = 10; ✅ 合法:可以修改數據
// 3. 指向常量的常量指針 - 兩者皆不可修改
const int* const p3;
int const* const p3; // 等價
// p3 = &other; ❌, *p3 = 10; ❌
「指向常量的指針 (pointer to const)」:`const double *cptr` 或 `double const *cptr`。
「常量指針 (const pointer)」:`int *const cptr`。
書中**嚴格區分**這兩個概念,並**沒有**使用「指針常量」這個易混淆的中文術語,而是用「常量指針」對應 `const pointer` (指針本身是常量)。
| 英文標準術語 | 建議中文稱呼 | 語法特徵 | 核心限制 |
|---|---|---|---|
| Pointer to const | 指向常量的指針 | `const T*` / `T const*` | 不可通過指針修改數據 (`*p = x` 錯誤) |
| Const pointer | 常量指針 (或 指針常量) | `T* const` | 不可修改指針指向 (`p = &x` 錯誤) |
| Const pointer to const | 指向常量的常量指針 | `const T* const` | 雙重限制 |
int const * const p;
// ↑ ↑
// | └── p is a const pointer (指針常量)
// └──────── p points to a const int (指向常量的指針)
void func(const int* p) { *p = 10; } // ❌ 編譯錯誤:p 是指向常量的指針
void func(int* const p) { p = nullptr; } // ❌ 編譯錯誤:p 是常量指針
void func(const int* const p) { } // ✅ 兩者皆不可修改