首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 指針術語權威解析:常量指針 vs 指針常量,《C++ Primer》與網絡資料不一致的根本原因與記憶法

     編輯:程式設計疑難解答

核心結論

以《C++ Primer》為準,以編譯器語法為準。
網絡資料不一致源於**中文翻譯習慣混淆、教材版本差異、作者理解偏差**。英文原版術語完全明確:

  • Pointer to const (指向常量的指針) ← **中文常稱「常量指針」**
  • Const pointer (常量指針/指針常量) ← **中文常稱「指針常量」**

語法鐵律:`const` 位置決定含義 (從右向左讀)

// 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; ❌

《C++ Primer》第 5 版 中文版第 56 頁原文對應

「指向常量的指針 (pointer to const)」:`const double *cptr` 或 `double const *cptr`。
「常量指針 (const pointer)」:`int *const cptr`。

書中**嚴格區分**這兩個概念,並**沒有**使用「指針常量」這個易混淆的中文術語,而是用「常量指針」對應 `const pointer` (指針本身是常量)。

為什麼網上資料「相反」?

  1. 中文語法歧義:「常量指針」可理解為「常量的指針」(指向常量) 或「指針是常量」。不同作者/教材約定俗成不同。
  2. 早期教材翻譯不統一:C++98 時代各家翻譯不同,流傳至今。
  3. 記憶法傳播錯誤:如「const 在 * 左邊修飾數據,右邊修飾指針」被簡化為「左常量右指針」,忽略了 `int const*` 這種寫法。

統一術語建議 (消除歧義)

英文標準術語建議中文稱呼語法特徵核心限制
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) { } // ✅ 兩者皆不可修改

總結

  1. 認準語法:`const` 在 `*` 右邊 (`T* const`) → 指針本身不可變;`const` 在 `*` 左邊 (`const T*`) → 指向的數據不可變。
  2. 認準英文:Pointer to const / Const pointer。中文術語僅作輔助理解。
  3. 《C++ Primer》權威:其定義與 C++ 標準、主流現代教材一致。
  4. 網絡資料參考價值低:遇到衝突以編譯器報錯為最終仲裁。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved