首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 const 關鍵字深度解析

     編輯:關於C語言

核心含義

const 是型別修飾符,用於宣告「唯讀」物件。被 const 修飾的變數在初始化後,其值在程式執行期間不可修改。編譯器會對寫入操作發出錯誤,並可能將該物件置於唯讀記憶體區段(如 .rodata),進一步由硬體保護。

基本用法

1. 修飾基本型別

const int MAX_CONN = 1024;        // 常數整數
const double PI = 3.1415926535;   // 常數浮點數
const char *GREETING = "Hello";   // 指向常數字串的指標

2. 修飾指標——關鍵在於「誰被 const 保護」

宣告含義可修改項
const int *p / int const *p指向 常數整數 的指標指標 p 本身
int *const p常數指標,指向整數指向的整數值 *p
const int *const p常數指標,指向常數整數無(雙重唯讀)

記憶口訣:

「const 靠近誰,誰就被鎖死」。讀宣告時從右向左讀:

  • int *const p → p is a const pointer to int
  • const int *p → p is a pointer to const int

進階場景

1. 函數參數與回傳值

// 輸入緩衝區:承諾不修改內容
size_t strlen(const char *str);

// 輸出緩衝區:呼叫者提供空間,函數填充
void get_timestamp(char *buf, size_t len);

// 回傳唯讀指標:防止呼叫者修改內部狀態
const Config *get_global_config(void);

2. 結構體與陣列

struct Point { int x, y; };
const struct Point ORIGIN = {0, 0};        // 整個結構體唯讀
const int PRIMES[] = {2, 3, 5, 7, 11};     // 陣列唯讀

3. C++ 專屬:成員函數與 mutable

class Cache {
    mutable std::mutex mtx_;           // 即使在 const 物件上也可修改
    mutable std::unordered_map cache_;
public:
    Value get(Key k) const {           // const 成員函數
        std::lock_guard lk(mtx_);
        return cache_[k];
    }
};

常見誤區與最佳實踐

  1. 不要用 #define 代替 const:const 有型別、作用域、可除錯,#define 只是文字替換。
  2. 指標參數預設加 const:若函數不修改指向內容,參數應宣告為 const T*,提升介面契約清晰度。
  3. 避免「去 const」轉型:const_cast 或 C 風格轉型移除 const 後寫入,屬於未定義行為(UB),若物件原本在唯讀段將導致崩潰。
  4. 區分「常數指標」與「指向常數的指標」:這是面試與程式碼審查的高頻考點,務必熟練掌握。
  5. C99 可變長度陣列 (VLA) 不能用 const 修飾:const int n = 10; int arr[n]; 在 C 標準中不合法(C++ 則允許)。

標準庫中的 const 慣例

  • string.h:strlen(const char*), strcmp(const char*, const char*), memcpy(void*, const void*, size_t)
  • stdlib.h:bsearch(const void*, const void*, ...), qsort(void*, size_t, size_t, int(*)(const void*, const void*))
  • 慣例:輸入指標加 const,輸出指標不加。

善用 const 能讓編譯器幫你攔截大量邏輯錯誤,也是介面設計專業度的重要標誌。建議在所有新程式碼中「預設加 const,必要時再移除」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved