摘要
在C語言程序編寫中,const、static關鍵字是比較熟悉的,volatile關鍵字是比較少見的。但是在嵌入式工程開發中,const、static、volatile都是很常見的,我們嵌入式程序員需要熟知這三個關鍵字的恰當用法。下面是我參照網路上的大咖,大牛的博文,然后做一些代碼測試,撰寫一下自己的體會。歡迎大家一起交流討論。
const
const修飾的變量是常變量,只有讀權限,無寫權限。read_only。修飾的函數是常函數。
幾點認識:
const修飾的變量需要同時初始化
const int a;
[Error] uninitialized const ‘a’ [-fpermissive]
正確的是 const int a = 0;
數據類型對于const是透明的
int const a = 0; <=> const int a = 0;
const int *p1 = &a; <=> int const *p1 = &a
const用于封鎖直接修飾的內容
關于const一個很有意思的demo:
這段代碼是能夠編譯通過的,編譯結果如下:
我們來看代碼:const int *p1 = &a, 指針p1的指向可以修改,但是指向的內容不可修改。可以看到p1指向的地址和a一樣,我們不能通過*p1的內容去修改a,但是修改a的內容卻可以修改*p1。p1 = &b,表示指針指向可以改變,但是不能通過*p1改變b的內容,但是通過修改b的內容可以修改*p1。
static
static修飾的變量是靜態變量,修飾的函數是靜態函數。在C++中,修飾的變量也叫類變量,修飾的函數也叫類函數或類方法。這些變量或函數屬于整個類。
在C中,static【局部】修飾函數體內的變量,可以延長局部變量的生命周期。函數一般是在棧中執行的,每一次調用,入棧出棧后變量都會經歷定義到銷毀,不會保存上一次的值。但是static修飾的變量是放在堆中,不會經歷函數調用的生命過程。
static【全局】修飾函數體外的變量,或者修飾函數。都是只能在當前的源文件中被訪問,其他的文件不能訪問。當多個模塊中有重名的對象出現時,不防用static修飾。
static修飾的變量沒有初始化時,默認為0。
volatile
olatile修飾的變量是這變量可能會被意想不到地改變,這樣編譯器就不會假設這個變量的值了。精確地說,編譯器優化的時候每次都從變量的內存地址讀取,而不是從寄存器或者cache緩存中讀取。以下是volatile使用的場合:
并行設備的硬件寄存器(狀態寄存器)
一個中斷服務子程序中會訪問到的非自動變量,對線程任務中被幾個任務共享的變量。
作者:OathKeeper_Sn
來源:CSDN
原文:https://blog.csdn.net/windsnow1/article/details/87929904
你怎么看?▼