許多開發者在長期未使用 C++ 後,會發現連最基礎的指標與常量結合語法都記憶模糊。本文將系統梳理 const int* ptr(常量指標)與 int* const ptr(指標常量)的核心差異,並提供一套「從右向左讀」的通用記憶法,助你徹底攻克這個經典面試題。
中文翻譯容易造成混淆,不若直接理解英文原意:
int const* ptr 或 const int* ptr。int* const ptr。掌握這一規則,即可秒懂所有 const 與指標的組合:
ptr)。* 表「是個指標」;遇到 const 表「左邊緊鄰的元素不可修改」。int)。範例 1: int const* ptr
ptr → 變數名
* → 是個指標
const → 指向的資料不可修改(常量)
int → 指向整數
範例 2: int* const ptr
ptr → 變數名
const → 指標本身不可修改(常量指標)
* → 是個指標
int → 指向整數
int a1 = 1, b1 = 2, c1 = 3;
int* pointer = &a1; // 普通指標
int const* pointerToConst = &b1; // 常量指標
int* const constPointer = &c1; // 指標常量
int a2 = 10, b2 = 20, c2 = 30;
pointer = &a2; // ✅ 合法:改變指向
pointerToConst = &b2; // ✅ 合法:改變指向
// constPointer = &c2; // ❌ 編譯錯誤:指標常量不可改變指向
*pointer += 100; // ✅ 合法:修改資料
// *pointerToConst += 100; // ❌ 編譯錯誤:資料為常量
*constPointer += 100; // ✅ 合法:修改資料
// 輸出:*pointer=110, *pointerToConst=20, *constPointer=103
理解 const 修飾其右側緊鄰元素後,複雜聲明迎刃而解:
const int* const ptr:指向常量的常量指標(雙重限制)。int* const* ptr:指向「指標常量」的指標。const int const* ptr — 對 int 重複套用 const,編譯器會報警(C4114)。建議:代碼中優先使用英文語義(PointerToConst、ConstPointer)命名變數,從根源上消除中文術語歧義。