const 是 C 語言中「只讀」語義的核心關鍵字,正確使用能提高代碼安全性、可讀性並幫助編譯器優化。本文從基礎到進階系統講解。
const int MAX_SIZE = 100; // 常量,不可修改
int arr[MAX_SIZE]; // C99 支持變長數組,但 const 變量不可作為標準 C 數組大小(C89)
// 標準做法:#define MAX_SIZE 100 或 enum { MAX_SIZE = 100 }
注意:C 語言中 const int n = 10; int arr[n]; 在 C99 中合法,但 C89 不支持,且 const 變量本質仍是變量,有地址佔用內存。
口訣:「誰在 * 右邊,誰就是常量」
| 聲明 | 含義 | 可修改內容 | 可修改指針 |
|---|---|---|---|
const int *p / int const *p | 指向常量的指針 | ❌ *p = 10 錯誤 | ✅ p = &other 合法 |
int *const p | 常量指針(指針本身不可變) | ✅ *p = 10 合法 | ❌ p = &other 錯誤 |
const int *const p | 指向常量的常量指針 | ❌ | ❌ |
void test_const_pointers() {
int a = 10, b = 20;
// 情況 1:指向常量的指針
const int *p1 = &a;
// *p1 = 20; // 編譯錯誤:不能通過 p1 修改值
p1 = &b; // 合法:可指向其他地址
// 情況 2:常量指針
int *const p2 = &a;
*p2 = 20; // 合法:可修改指向的值
// p2 = &b; // 編譯錯誤:指針本身不可變
// 情況 3:雙重 const
const int *const p3 = &a;
// *p3 = 30; // 錯誤
// p3 = &b; // 錯誤
}
const char *str = "hello"; // 正確:字符串字面量存放在只讀區 // str[0] = 'H'; // 運行時崩潰:嘗試修改只讀內存 char *bad = "hello"; // 危險:舊標準允許,但極不推薦
// 1. 參數指向的內容不可修改(常用於輸入參數)
void print_str(const char *str) { /* ... */ }
// 2. 參數指針本身不可修改(較少用)
void func(int *const ptr) { /* ... */ }
// 3. 引用傳遞配合 const(C++ 風格,C 中用指針模擬)
void process(const BigStruct *data) { /* 避免拷貝且防修改 */ }
const,除非需要修改const char *#define 或 enumconst struct Type *volatile const