const 在函數參數中僅對指標類型有意義。非指標參數(傳值)本身就是副本,原值不可被修改,加 const 無實際作用。
const 類型 *指標 —— 限制修改指向的值int fun(const int *p) {
*p += 1; // 編譯錯誤:不能修改 *p
return *p;
}
用途:承諾函數只讀指標指向的數據,增強接口契約與安全性。
類型 *const 指標 —— 限制修改指標指向void swap(int *const p1, int *const p2) {
int *t = p1;
p1 = p2; // 編譯錯誤:不能修改 p1 本身
p2 = t;
}
用途:承諾函數不改變指標指向(但可修改指向的值)。
int fun(const int *p) {
int *p2 = p; // 去除 const 資格
*p2 += 1; // 合法修改
return *p;
}
C 語言允許隱式轉換 const int* → int*(雖有警告),const 非強制執行,僅靠編譯器檢查。
void swap(int *p1, int *p2) { // 無 const
int *t = p1;
p1 = p2; // 僅修改副本,不影響實參指標
p2 = t;
}
指標作為參數本身也是傳值(傳遞地址副本),函數內修改指標變量不影響調用者的指標變量。因此 *const 對防止實參指標被改無實際作用,僅防止函數內部誤操作。
void swap(int *const p1, int *const p2) {
int t = *p1;
*p1 = *p2;
*p2 = t; // 修改指向的值,而非指標本身
}
int const *const pint fun(int const *const p1, int const *const p2) {
return *p1 + *p2; // 既不改指向,也不改值
}
語法解讀:int const *const p = const int *const p,右側 const 修飾指標本身,左側修飾指向的值。
| 場景 | 推薦寫法 | 說明 |
|---|---|---|
| 只讀指向數據 | const int *p 或 int const *p | 標準做法,文檖接口意圖 |
| 不改指向(罕見需求) | int *const p | 防止函數內部誤賦值指標 |
| 雙重保護 | const int *const p | 嚴格只讀指標參數 |
| 字符串參數 | const char *str | 慣例,防止修改字面量 |
const 是編譯期承諾,非運行時強制,可通過強制轉型繞過。const 提升代碼可讀性、可維護性與靜態分析能力,是專業 C 開發者的基本素養。