const 限定只讀變量(Read-only Variable),而非常量常量。編譯器分配內存並禁止寫入,但運行期地址可讀、可傳遞。
const int n = 5;
int a[n]; // ANSI C 錯誤:n 非常量表達式
// C++ 合法:const 整型初始化為編譯期常量
enum、#define)。const int 仍不算常量表達式。enum { N = 5 }; 或 #define N 5。typedef char *pStr;
char str[4] = "abc";
const char *p1 = str; // *p1 唯讀,p1 可改
const pStr p2 = str; // p2 唯讀(展開為 char *const),*p2 可改
p1++; // ✓
p2++; // ✗ 編譯錯誤
判斷口訣:沿 * 劃線 —— const 在 * 左側 → 限定指向內容;在右側 → 限定指針本身。
char *p = "i'm hungry!";
p[0] = 'I'; // 未定義行為:字面值常在只讀段,寫入觸發段錯誤
// 正確
const char *p = "i'm hungry!"; // 承諾不修改
char arr[] = "i'm hungry!"; // 棧上複製,可修改
char a[3] = "abc"; // 合法但危險:無 \0 結尾
// strlen(a)、strcpy(a,...) 會越界讀取
// 必須 char a[4] = "abc" 或 char a[] = "abc"
| 聲明 | 限定內容 | 等價寫法 |
|---|---|---|
const int n | n | int const n |
const char *p | *p | char const *p |
char *const p | p | — |
const char *const p | p 和 *p | — |
const (char *) p | p(整體類型) | char *const p |
void func(const int* p) — 承諾不修改 *p,允許傳入常量/非常量指針。void func(int* const p) — 承諾不修改指針值,罕用。void func(const char* const p) — 雙重保護。const 是編譯期契約,提升安全性與可讀性。* 左右判斷限定對象,避開 typedef 陷阱。const char* 接收。\0 位置。constexpr 進一步提供真編譯期常量。