程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言中的volatile關鍵字

C語言中的volatile關鍵字

編輯:關於C

說明:

******一個被volatile關鍵字修飾的變量可能會被意想不到的改變,本意就是“易變的”。

******對於被volatile修飾的變量,當編譯器在編譯的時候不會去假設該變量的值

******對於被volatile修飾的變量,當優化器優化時,必須每次都小心的重新讀取該變量的值,而不能使用寄存器裡的備份。


使用volatile關鍵字的幾種情況:

******第一種情況:並行設備中的狀態寄存器(當不同設備訪問時,狀態可能會隨時變化的,所以要用volatile關鍵字修飾)

******第二種情況:一個中斷服務子程序中會訪問到的非自動變量(例如static變量)

******第三種情況:在多線程應用中多個任務會訪問到的共享變量。


有關volatile的幾個問題:

******1.一個參數既可以是const的也可以是volatile的嗎?

***答:可以的,一個只讀的狀態寄存器。它是const,因為程序不應該試圖去修改它,它是volatile,因為它的值可能會被意想不到的改變。

******2.一個指針可以是volatile的嗎?

***答:可以,一個中斷服務子程序中,修改一個指向buffer的指針。

******3.下面一段代碼其錯在哪兒?

int square(volatile int *ptr)
{
      int a;
      int b;
      a=*ptr;
      b= *ptr;
      return a*b;
}
因為整型指針ptr中的值可能會被意想不到的改變,也就是說ptr在某一時刻還指向這個內存地址,而在另一個時刻可能會指向另一個內存地址,所以就達不到求某個數的平方的目的。

修改後的代碼為:

int square(volatile int *ptr)
{
      int a;
      a=*ptr;
      return a*a;
}







  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved