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

C語言函數參數中的 const 修飾符:用法、繞過與最佳實踐

     編輯:關於C語言

const 參數核心規則

const 在函數參數中僅對指標類型有意義。非指標參數(傳值)本身就是副本,原值不可被修改,加 const 無實際作用。

兩種核心用法

1. const 類型 *指標 —— 限制修改指向的值

int fun(const int *p) {
    *p += 1;  // 編譯錯誤:不能修改 *p
    return *p;
}

用途:承諾函數只讀指標指向的數據,增強接口契約與安全性。

2. 類型 *const 指標 —— 限制修改指標指向

void swap(int *const p1, int *const p2) {
    int *t = p1;
    p1 = p2;  // 編譯錯誤:不能修改 p1 本身
    p2 = t;
}

用途:承諾函數不改變指標指向(但可修改指向的值)。

const 的局限性:可被繞過

繞過「不可修改值」

int fun(const int *p) {
    int *p2 = p;  // 去除 const 資格
    *p2 += 1;     // 合法修改
    return *p;
}

C 語言允許隱式轉換 const int* → int*(雖有警告),const 非強制執行,僅靠編譯器檢查。

第二種用法其實多餘?

void swap(int *p1, int *p2) {  // 無 const
    int *t = p1;
    p1 = p2;  // 僅修改副本,不影響實參指標
    p2 = t;
}

指標作為參數本身也是傳值(傳遞地址副本),函數內修改指標變量不影響調用者的指標變量。因此 *const 對防止實參指標被改無實際作用,僅防止函數內部誤操作。

正確的 swap 實現

void swap(int *const p1, int *const p2) {
    int t = *p1;
    *p1 = *p2;
    *p2 = t;  // 修改指向的值,而非指標本身
}

雙重 const:int const *const p

int fun(int const *const p1, int const *const p2) {
    return *p1 + *p2;  // 既不改指向,也不改值
}

語法解讀:int const *const p = const int *const p,右側 const 修飾指標本身,左側修飾指向的值。

最佳實踐總結

場景推薦寫法說明
只讀指向數據const int *p 或 int const *p標準做法,文檖接口意圖
不改指向(罕見需求)int *const p防止函數內部誤賦值指標
雙重保護const int *const p嚴格只讀指標參數
字符串參數const char *str慣例,防止修改字面量

關鍵認知

  • const 是編譯期承諾,非運行時強制,可通過強制轉型繞過。
  • 指標參數本質是傳址(地址傳值),修改指向的值影響實參,修改指標變量本身不影響實參。
  • 善用 const 提升代碼可讀性、可維護性與靜態分析能力,是專業 C 開發者的基本素養。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved