從變數名往右讀,再往左:
| 宣告 | 讀法 | 可修改指標 | 可修改指向值 |
|---|---|---|---|
const int *p / int const *p | p 是指向 const int 的指標 | 是 | 否 |
int * const p | p 是 const 指標指向 int | 否 | 是 |
const int * const p | p 是 const 指標指向 const int | 否 | 否 |
int *p | p 是指標指向 int | 是 | 是 |
int main() {
int a = 10, b = 20;
const int *p1 = &a; // 指向常數
// *p1 = 20; // 錯誤
p1 = &b; // 合法
int * const p2 = &a; // 常數指標
*p2 = 30; // 合法
// p2 = &b; // 錯誤
const int * const p3 = &a; // 雙重常數
// *p3 = 40; // 錯誤
// p3 = &b; // 錯誤
return 0;
}
const int *p:函數參數 void print(const int *arr, int n) 承諾不修改陣列。int * const p:固定指向特定硬體暫存器、記憶體映射區。volatile int * const REG = (int*)0x4000;const int * const p:常數表指標、字串常數指標。const int x = 10;
int *p = (int*)&x;
*p = 20; // 透過指標修改,行為未定義 (視平台而定)
printf("%d", x); // 可能輸出 10 (編譯器優化) 或 20
const 是編譯器契約,非硬體強制。嵌入式開發需配合 volatile 與記憶體保護單元 (MPU)。