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

C 語言 const 完全指南:從只讀變量到指針限定的 5 大核心場景

     編輯:關於C語言

const 本質

const 限定只讀變量(Read-only Variable),而非常量常量。編譯器分配內存並禁止寫入,但運行期地址可讀、可傳遞。

場景一:const 變量 ≠ 常量(數組維度陷阱)

const int n = 5;
int a[n];  // ANSI C 錯誤:n 非常量表達式
// C++ 合法:const 整型初始化為編譯期常量
  • ANSI C:數組長度需常量表達式(字面值、enum、#define)。
  • C99 支援 VLA,但 const int 仍不算常量表達式。
  • 定義真常量:enum { N = 5 }; 或 #define N 5。

場景二:const 限定對象判斷(指針/類型別名陷阱)

typedef char *pStr;
char str[4] = "abc";

const char *p1 = str;   // *p1 唯讀,p1 可改
const pStr p2 = str;    // p2 唯讀(展開為 char *const),*p2 可改

p1++;  // ✓
p2++;  // ✗ 編譯錯誤

判斷口訣:沿 * 劃線 —— const 在 * 左側 → 限定指向內容;在右側 → 限定指針本身。

場景三:字符串字面值與指針

char *p = "i'm hungry!";
p[0] = 'I';  // 未定義行為:字面值常在只讀段,寫入觸發段錯誤

// 正確
const char *p = "i'm hungry!";  // 承諾不修改
char arr[] = "i'm hungry!";     // 棧上複製,可修改

場景四:字符數組初始化陷阱

char a[3] = "abc";  // 合法但危險:無 \0 結尾
// strlen(a)、strcpy(a,...) 會越界讀取
// 必須 char a[4] = "abc" 或 char a[] = "abc"

場景五:const 與指針聲明全景表

聲明限定內容等價寫法
const int nnint const n
const char *p*pchar const *p
char *const pp—
const char *const pp 和 *p—
const (char *) pp(整體類型)char *const p

函數參數最佳實踐

  • void func(const int* p) — 承諾不修改 *p,允許傳入常量/非常量指針。
  • void func(int* const p) — 承諾不修改指針值,罕用。
  • void func(const char* const p) — 雙重保護。

總結

  1. const 是編譯期契約,提升安全性與可讀性。
  2. 指針聲明按 * 左右判斷限定對象,避開 typedef 陷阱。
  3. 字符串字面值必配 const char* 接收。
  4. 數組初始化預留 \0 位置。
  5. C++ constexpr 進一步提供真編譯期常量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved