| 聲明 | 含義 | 可修改指針值 | 可修改指向內容 |
|---|---|---|---|
char *const p | 指針常量(指針本身不可變) | ❌ | ✅ |
char const *p / const char *p | 常量指針(指向內容不可變) | ✅ | ❌ |
char str1[] = "hello";
char str2[] = "world";
// 1. 指針常量:p 必須初始化,之后不能指向别处
char *const p1 = str1;
*p1 = 'H'; // OK:修改內容 → "Hello"
// p1 = str2; // 編譯錯誤:不能改變指針指向
// 2. 常量指針:可指向不同地址,但不能通過它修改內容
const char *p2 = str1;
printf("%s\n", p2); // OK:讀取
// *p2 = 'H'; // 編譯錯誤:不能修改內容
p2 = str2; // OK:改變指向 → "world"
// 3. 組合:既不能改指向,也不能改內容
const char *const p3 = str1;
const 修飾誰,誰就不可變。const 在 * 左邊修飾內容,右邊修飾指針。
部分老舊編譯器(如 VC6.0)對字符串字面量賦值給非 const char* 只給警告,現代編譯器(GCC、Clang、MSVC 新版)嚴格要求 const char* 接收字符串字面量。