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

C語言 const 關鍵字深度解析:只讀變量、指針組合、偽常量本質與嵌入式實戰

     編輯:關於C語言

C語言 const 關鍵字深度解析:只讀變量、指針組合、偽常量本質與嵌入式實戰

const 是 C 語言中最常用也最易誤解的關鍵字之一。它不僅修飾「常量」,更核心語義是「只讀」。本文系統梳理 const 修飾變量、指針、函數參數、返回值的規則,揭示其「偽常量」本質,並給出嵌入式開發中的最佳實踐。

一、const 修飾基本類型:只讀變量

const int MAX_SIZE = 100;
// MAX_SIZE = 200; // 編譯錯誤:賦值左值為只讀

// 等價寫法(風格偏好)
int const MAX_SIZE = 100; // 同義,讀作 "MAX_SIZE 是 const int"
  • 編譯器會在符號表標記為只讀,不分配內存(視優化情況可能放入 .rodata 段)。
  • 取地址 &MAX_SIZE 類型為 const int *,強制轉型去 const 後寫入屬於未定義行為(可能觸發硬件異常或靜默失效)。

二、const 與指針的四種組合(右左法則)

口訣:const 修飾左側最近的類型;若左側無類型則修飾右側最近的類型。

聲明讀法指針可變指向值可變典型用途
const int *p
int const *p
指向 const int 的指針✅❌函數參數防修改 void foo(const int *p)
int *const pconst 指針指向 int❌✅固定指向某塊內存(如硬件寄存器映射)
const int *const pconst 指針指向 const int❌❌只讀查表、常量字符串指針
int const *const p同上❌❌同上

三、const 在函數接口中的契約式設計

const int val = 10;
int *p = (int *)&val; // 強制去 const
*p = 20; // UB:可能修改成功(棧上),可能崩潰(.rodata 段只讀頁),可能無效果(編譯器優化假設 val 不變)
// 結論:絕不可去 const 寫入,除非極少數硬件寄存器映射場景(volatile 配合)。

C++:真正的編譯期常量

  • const int n = 10; int arr[n]; // 合法,n 是常量表達式
  • 內部鏈接性:文件級 const 默認 static,C 需顯式 static const。
  • constexpr (C++11) 進一步保證編譯期計算。

五、嵌入式實戰:const + volatile 組合拳

(C++11 起非 const 賦值已棄用)。
  • 宏定義常量 優先用 const 變量替代:類型安全、可調試、作用域受控。
  • 結構體大對象傳參 用 const 指針/引用 避免拷貝:void process(const BigStruct *p);
  • 不要試圖通過去 const 修改 const 對象,行為未定義,跨平台風險極大。
  • 總結

    const 是 C 語言類型系統中表達「只讀意圖」的核心工具。掌握指針組合規則、理解其與 C++ 的差異、善用 const + volatile 建模硬件,能顯著提升代碼健壯性、可讀性與優化機會。記住:const 是給編譯器和讀代碼的人看的契約,不是給運行時硬件強制執行的鎖。

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