| 宣告 | 俗稱 | 指標值可改? | 指向值可改? | 初始化要求 |
|---|---|---|---|---|
const int a = 2; | const 常數 | — | ❌ | 宣告時必須初始化 |
const int* p;int const* p; | 常數指標 (指向常數的指標) | ✅ | ❌ | 可延遲初始化 |
int* const p = &n; | 指標常數 (常數指標) | ❌ | ✅ | 宣告時必須初始化(且只能指向變數) |
const int* const p = &e; | 指向常數的指標常數 | ❌ | ❌ | 宣告時必須初始化 |
const int a = 2; // 推薦風格
int const b = c; // 等價,c 為既有變數
// a = 3; // 編譯錯誤
const int* p; // 或 int const* p
// *p = 5; // ❌ 不能透過指標修改指向值
p = &x; // ✅ 可以改變指向對象
int x, y;
p = &x; p = &y; // ✅ 可指向變數
理解為:「為了指向常數而設計的指標」。
int* const p = &n; // n 必須是變數
// p = &m; // ❌ 指標本身不可修改
*p = 20; // ✅ 可以透過指標修改指向值
因為指標本身是常數,**宣告時必須初始化**,且只能指向變數(否則無法發揮「可修改指向值」的意義)。
const int* const p = &e; // e 可為常數或變數
// 完全唯讀:指標固定、指向值固定
const int* p:const 在 * 左側 → 修飾 *p(解引用結果)為常數 → **指向常數的指標**。int* const p:const 在 * 右側 → 修飾 p(指標本身)為常數 → **指標常數**。const int a = n; // 常數
const int* a; // 常數指標
int* const a = &n; // 指標常數
void func(const int* p):承諾不修改指向資料(輸入參數)。void func(int* const p):承諾不修改指標本身(罕用)。const int& func():回傳常數引用,防止修改內部資料。掌握 const 相對 * 的位置語意,即可輕鬆區分四種型態。善用 const 表達設計意圖,讓編譯器協助防禦誤改,是 C++ 程式碼健壯性的基石。