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

C 語言 const 與指針結合的四種模式完整解析

     編輯:關於C語言

核心規則速覽

const 與指針結合時,關鍵在於 const 相對於 * 的位置:

  • const 在 * 左側:修飾指針指向的數據為常量(指針可變,指向內容不可變)。
  • const 在 * 右側:修飾指針本身為常量(指針不可變,指向內容可變)。

四種組合詳細說明

聲明形式指針本身指向的數據典型用途
int const *p
const int *p
可修改不可修改函數參數傳遞只讀緩衝區
int * const p不可修改可修改固定指向特定硬體寄存器或內存映射區
const int * const p不可修改不可修改只讀查找表、常量字符串指針

實戰陷阱:const 變量可通過指針修改?

在 GCC 下,const 修飾的變量僅是編譯器層面的只讀承諾,若通過強制類型轉換獲取非 const 指針,仍可修改內存值:

int main(void) {
    const int a = 5;
    // a = 6; // 編譯報錯:assignment of read-only variable 'a'
    int *p = (int *)&a; // 強制轉換消除警告
    *p = 6;
    printf("a = %d.\n", a); // 輸出 a = 6,證明內存被修改
    return 0;
}

原理:const int a 僅告訴編譯器「不應修改」,並未將內存頁標記為硬件只讀(除非鏈接器將其放入 .rodata 段且啟用寫保護)。嵌入式開發中若需真正只讀,須配合 const + 鏈接腳本放入只讀段,或使用硬體存儲保護單元(MPU)。

最佳實踐建議

  1. 優先使用 const int *p 表達「只讀數據」語義,增強代碼可讀性與編譯器優化機會。
  2. 需固定指針指向時,明確使用 int * const p。
  3. 避免對 const 變量通過指針修改,屬於未定義行為,可能導致優化錯誤或運行時崩潰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved