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

C語言 const 完全解析:常量變量、指針常量、常量指針、頂層/底層 const 識別法

     編輯:關於C語言

核心概念: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 在函數參數中的契約含義

const 與 constexpr (C++11) / 宏 對比

參數聲明語義契約適用場景
void func(const int* p)只讀輸入緩衝區,不修改數據字符串處理、數據分析、回調輸入
void func(int* const p)輸出緩衝區地址固定,內容可寫罕見,通常隱含在 API 文檔中
void func(const int* const p)純輸入,地址內容雙重保護高安全要求接口

總結

const 是類型系統的一部分,宏不是。 讀聲明從右向左,識別頂層/底層 const,函數參數盡量加 const 表達只讀意圖。C 語言中 const int 仍需內存存儲(非常量表達式),C++ constexpr 才真正進入編譯期常量池。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性const#defineconstexpr (C++)
類型安全✓✗✓
作用域✓✗ (全局)✓
調試可見✓✗✓
編譯期常量視情況 (C++ 是,C 否)✓✓ 強制
內存佔用可能 (非 constexpr 時)無無 (純編譯期)