指標四大概念必分清
- 指標類型:宣告時的類型(
int *p 中的 int *)
- 指向類型:解參考得到的類型(
int)
- 指標值:儲存的位址(
p 的值)
- 指標本身位址:
&p
常量指標 vs 指標常量
| 名稱 | 宣告 | 本質 | 指向可變? | 指向值可變? |
| 常量指標 | const int *p / int const *p | 指標變數 | ✅ 可改指向 | ❌ 不可透過 p 修改 |
| 指標常量 | int *const p | 常量(指標) | ❌ 初始化後不可改指向 | ✅ 可透過 p 修改值 |
| 指向常量的指標常量 | const int *const p | 常量 | ❌ | ❌ |
int a=5, b=6;
const int *p = &a; p = &b; // OK
*p = 10; // Error
int *const q = &a; *q = 10; // OK
q = &b; // Error
函數指標 vs 指標函數
- 函數指標:指向函數的指標變數
int (*fp)(int);
- 指標函數:返回指標的函數
int *func(void);
int add(int a, int b) { return a+b; }
int (*fp)(int,int) = add; // 函數指標
fp(3,4); // 7
實務建議
- 讀複雜宣告遵循「右左法則」:從變數名出發,先右後左,遇括號優先
const 放在 * 左邊修飾指向值,右邊修飾指標本身
- 函數指標常用於回呼、狀態機、虛擬表實現多態