「看 * 右邊」:* 右邊有 const → 指針本身不可變 (常量指針);
「看 * 左邊」:* 左邊有 const → 指向的數據不可變 (指向常量的指針)。
| 聲明 | 含義 | 可修改指針? | 可修改數據? |
|---|---|---|---|
const int* p / int const* p | 指向 常量整數 的指針 | 是 | 否 |
int* const p | 指向整數的 常量指針 | 否 | 是 |
const int* const p | 指向 常量整數 的 常量指針 | 否 | 否 |
int* p | 普通指針 | 是 | 是 |
#include <iostream>
int main() {
const int i = 10;
int a = 20;
const int* p1 = &i; // 數據不可改,指針可改
// *p1 = 5; // Error
p1 = &a; // OK
int* const p2 = &a; // 指針不可改,數據可改
*p2 = 30; // OK
// p2 = &i; // Error: 不能將 const int* 轉為 int* const
const int* const p3 = &i; // 雙重 const
// *p3 = 5; // Error
// p3 = &a; // Error
return 0;
}
被 const 修飾的全局/靜態變量通常會被編譯器放入 只讀數據段 (.rodata),最終燒錄進 ROM/Flash,不佔用寶貴的 RAM。這對資源受限單片機至關重要。
#define 定義常量,無類型安全。const (或 constexpr),擁有類型檢查、作用域限制、可調試符號表。void func(const int* p) { /* ... */ }
int main() {
int* p = nullptr;
func(p); // OK: int* 隱式轉換到 const int*
// 反向轉換需要 const_cast,極度危險,除非確定原對象非 const
}