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

C語言關鍵字深度解析:const 與 volatile 的特性與應用

     編輯:關於C語言

const 與 volatile 分析

1. const 修飾變數

  • 在 C 語言中,const 修飾的變數是唯讀的,其本質仍是變數。
  • const 修飾的變數會在記憶體佔用空間。
  • 本質上 const 僅對編譯器有效,執行時期無作用。
  • 原來 const 不是真正的常數。

const 變數記憶體佔用示意

2. const 修飾陣列

  • C 語言中 const 修飾的陣列是唯讀的。
  • const 修飾的陣列空間不可被改變。
const int A[5] = {1, 2, 3, 4, 5};
int *p = (int *)A;
int i = 0;
for(i=0; i<5; i++) {
    p[i] = 5-i; // 編譯報錯
}

3. const 修飾指標

  • const int *p; // p 可變,p 指向的內容不可變
  • int const *p; // 同上
  • int *const p; // p 不可變,p 指向的內容可變
  • const int *const p; // p 不可變,p 指向的內容也不可變

口訣:左數右指。當 const 出現在 * 號左邊時,指標指向的資料為常量;當 const 出現在 * 號右邊時,指標本身為常量。

4. const 修飾函數參數與返回值

  • const 修飾函數參數表示在函數體內不希望改變參數的值。
  • const 修飾函數返回值表示返回值不可改變,多用於返回指標的情形。
const int * func() {
    static int count = 0;
    count++;
    return &count;
}

深藏不露的 volatile

  • volatile 可理解為「編譯器警告指示字」。
  • 用於告訴編譯器必須每次去記憶體中取變數值。
  • 主要修飾可能被多執行緒存取的變數。
  • 也可修飾可能被未知因素改變的變數。

volatile 實例

int obj = 10;
int a = 0;
int b = 0;

a = obj;
sleep(100);
b = obj;

上述代碼中,編譯器發現 obj 未被當作左值使用,會「聰明」地直接將 obj 替換為 10,導致 a 和 b 都被賦值為 10。若加上 volatile,編譯器將不再優化,每次都從記憶體讀取最新值。

課後思考

const 和 volatile 是否可以同時修飾一個變數?

const volatile int i = 0;

答:可以。此時 i 具備 const 和 volatile 的雙重屬性:變數不可在編譯過程中被程式碼修改,同時編譯器不得對 i 進行優化編譯。

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