指標進階主題:`const` 修飾位置語意差異、字串字面值 vs 字元陣列、函數指標陣列應用。
| 形式 | 範例 | 儲存區 | 可修改 | 整體賦值 |
|---|---|---|---|---|
| 字元陣列 | `char name[32] = "zhangsan";` | 堆疊 | 是 | `strcpy(name, "lisi");` |
| 字元指標 | `char *name = "zhangsan";` | 常數區 | 否 (崩潰) | `name = "lisi";` (改指向) |
注意:`char *name; scanf("%s", name);` 未初始化 → 未定義行為;`strcpy(name, "lisi")` 若指向字串常值 → 崩潰。
const int *p; /* 指向常數整數:不可透過 p 修改值,p 可改指向 */
int const *p; /* 等同上 */
int *const p; /* 常數指標:p 不可改指向 (須初始化),可透過 p 修改值 */
const int *const p; /* 雙重常數:指向常數的常數指標,均不可改 */
口訣:`const` 在 `*` 左邊修飾「指向的值」;在 `*` 右邊修飾「指標本身」。
int add(int a, int b) { return a+b; }
int sub(int a, int b) { return a-b; }
int mul(int a, int b) { return a*b; }
int div(int a, int b) { return a/b; }
int (*ops[4])(int, int) = {add, sub, mul, div}; /* 函數指標陣列 */
int main() {
for (int i = 0; i < 4; i++)
printf("%d ", ops[i](10, 5)); /* 15 5 50 2 */
return 0;
}
應用場景:狀態機、命令分發、回呼表、多態模擬。
搞清 `const` 位置、字串儲存類別、函數指標陣列宣告語法,是邁向 C 語言專家的關鍵里程碑。