char a[] = "hello";
a[0] = 'X'; // ✅ 陣列在棧/靜態區,內容可改
char* p = "world"; // 指向靜態區字串字面值 (唯讀)
p[0] = 'X'; // ❌ 編譯通過,執行期崩潰 (存取違規)
編譯器**無法靜態偵測**此錯誤,**務必肌肉記憶**:char* p = "literal" 唯讀。
| 操作 | 陣列 | 指標 |
|---|---|---|
| 複製 | strcpy(b, a) ❌ b = a | malloc → strcpy(p, a) ❌ p = a (僅複製地址) |
| 比較 | strcmp(b, a) == 0 ❌ b == a | strcmp(p, a) == 0 ❌ p == a (比較地址) |
// 陣列
char a[] = "hello";
char b[10];
strcpy(b, a);
if (strcmp(b, a) == 0) { ... }
// 指標
int len = strlen(a);
char* p = (char*)malloc(sizeof(char) * (len + 1));
strcpy(p, a);
if (strcmp(p, a) == 0) { ... }
free(p); // 記得釋放
核心概念:陣列名 = 地址常量 (不可修改左值);指標 = 地址變量。**內容操作必須用標準庫函數**,別嘗試用賦值/比較運算子。