int *p[10]; // 指針數組:含 10 個 int* 元素的數組
int (*p)[10]; // 數組指針:指向「含 10 個 int 的數組」的指針
記憶口訣:`[]` 結合力優於 `*`。`p[10]` 先結合 → 數組;`(*p)[10]` 先結合指針 → 指向數組的指針。
int (*p)(int, int); // 函數指針:指向「接受兩個 int、返回 int 的函數」
int *max(int, int); // 指針函數:返回 int* 的函數
區別:前者是指針變量,後者是函數聲明。
char *p = "gooseberry"; // 指向只讀區,不可修改內容
char a[] = "gooseberry"; // 棧上分配,可修改內容
實驗驗證:
// 錯誤示範
char *p = "gooseberry";
p[0] = 'G'; // 未定義行為,可能崩潰
// 正確做法
char a[] = "gooseberry";
strncpy(a, "black", 5); // a 變為 "blackberry"
| 類型 | 聲明 | 含義 | 可修改指針 | 可修改指向值 |
|---|---|---|---|---|
| 常量指針 | const int *p / int const *p | 指向常量的指針 | 是 | 否 |
| 指針常量 | int *const p | 指針本身是常量 | 否(須初始化) | 是 |
| 雙重常量 | const int *const p | 指針和指向值均不可修改 | 否 | 否 |
void trap_demo() {
int a = 10, b = 20;
const int *p1 = &a; // 常量指針
int *const p2 = &a; // 指針常量
p1 = &b; // ✓ 合法
*p1 = 30; // ✗ 非法
p2 = &b; // ✗ 非法
*p2 = 30; // ✓ 合法
}