字符串常量(如 "a string")存放在靜態存儲區,程序運行期間始終佔用。編譯器自動在末尾添加 \0 作為結束標誌,故實際佔用字節數 = 字符數 + 1。
char s[] = "a string";
// s 有 9 個元素,s[8] = '\0'
// 編譯器將字符串拷貝到數組,屬於初始化
char *cp;
cp = "a string";
// cp 指向字符串常量首字符 'a'
// 字符串常量在表達式中退化為字符指針
內存圖示:
cp ┏━━━┓ ┏━┳━┳━┳━┳━┳━┳━┳━┳━┓ ┃ ┃──→┃a ┃ ┃s ┃t ┃r ┃i ┃n ┃g ┃\0┃ ┗━━━┛ ┗━┻━┻━┻━┻━┻━┻━┻━┻━┛
*cp 或 cp[0] → 首字符 'a'cp[i] 或 *(cp+i) → 第 i 個字符⚠️ 不可通過指針修改字符串常量內容。字符串常量處於只讀區,嘗試修改導致未定義行為(通常崩潰)。若需可修改字符串,請使用字符數組:
char s[] = "modifiable"; // 正確:數組在棧上,可修改
char *p = "read-only"; // 僅讀
const char * 表示不修改