核心概念:const 修飾「右側最近的實體」
讀法口訣:**從右向左讀**,遇到 * 說「指向」,遇到類型說類型,const 說「只讀」。
四大基本形態
| 聲明 | 口訣讀法 | 含義 | 可修改內容 |
const int x = 10;
int const x = 10; | x 是只讀 int | 變量值不可修改 | 無 |
const int* p;
int const* p; | p 是指向只讀 int 的指針 | 底層 const:*p 不可改,p 可改 | p = &other; ✓ |
int* const p = &x; | p 是只讀指針指向 int | 頂層 const:p 不可改,*p 可改 | *p = 20; ✓ |
const int* const p = &x; | p 是只讀指針指向只讀 int | 雙重 const:p、 *p 皆不可改 | 無 |
實戰驗證代碼
#include
int main() {
int a = 3, b = 6, c = 9;
const int* p = &a; // 底層 const:指向常量的指針
int* const p1 = &b; // 頂層 const:常量指針
const int* const p2 = &c; // 雙重 const
p = &b; // ✓ 修改指向
// *p = 4; // ✗ 編譯錯誤:assignment of read-only location '*p'
a = 4; // ✓ 通過原變量修改
// p1 = &a; // ✗ 編譯錯誤:assignment of read-only variable 'p1'
*p1 = 5; // ✓ 修改指向內容
b = 7; // ✓
// p2 = &c; // ✗
// *p2 = 8; // ✗
c = 3; // ✓
return 0;
}
頂層 vs 底層 const 識別速查
- 頂層 const:修飾指針本身(
* 右側的 const)。表示指針不可變,拷貝時頂層 const 被忽略。
- 底層 const:修飾指針指向的對象(
* 左側的 const)。表示對象不可變,拷貝時要求目標也有底層 const。
int i = 0;
const int* p = &i; // 底層 const
int* const q = &i; // 頂層 const
const int* const r = &i; // 底層 + 頂層
// 拷貝規則
int* p2 = p; // ✗ 底層 const 不能隱式去掉
const int* p3 = p; // ✓ 保留底層 const
int* p4 = q; // ✓ 頂層 const 被忽略,拷貝指針值
const 在函數參數中的契約含義
| 參數聲明 | 語義契約 | 適用場景 |
void func(const int* p) | 只讀輸入緩衝區,不修改數據 | 字符串處理、數據分析、回調輸入 |
void func(int* const p) | 輸出緩衝區地址固定,內容可寫 | 罕見,通常隱含在 API 文檔中 |
void func(const int* const p) | 純輸入,地址內容雙重保護 | 高安全要求接口 |
const 與 constexpr (C++11) / 宏 對比
| 特性 | const | #define | constexpr (C++) |
| 類型安全 | ✓ | ✗ | ✓ |
| 作用域 | ✓ | ✗ (全局) | ✓ |
| 調試可見 | ✓ | ✗ | ✓ |
| 編譯期常量 | 視情況 (C++ 是,C 否) | ✓ | ✓ 強制 |
| 內存佔用 | 可能 (非 constexpr 時) | 無 | 無 (純編譯期) |
總結
const 是類型系統的一部分,宏不是。 讀聲明從右向左,識別頂層/底層 const,函數參數盡量加 const 表達只讀意圖。C 語言中 const int 仍需內存存儲(非常量表達式),C++ constexpr 才真正進入編譯期常量池。
- 上一篇文章: C語言枚舉 enum 完整指南:默認值、指定值、重復值與作用域規則
- 下一篇文章: Objective-C 數據類型與格式化符號速查表
Copyright ©
程式碼之家 All Rights Reserved