關於變數的儲存類別的理解。
阿新 • • 發佈:2018-12-20
作為在嵌入式底層搬磚兩年的一個embeder,最近兩度被xxx提問關於關鍵字的用法提問住了,於是回來馬上對嵌入式C中的關鍵字做一個總結和框圖化整理。
C語言中關鍵字:auto、extern、static、 register、const、volatile、_Thread_local(多執行緒,併發用到)、_Atomic(多執行緒,併發用到)
auto 變數:
宣告在塊或者函式頭中的任何變數都屬於自動儲存類別。 當然也可以用關鍵字auto. 需要注意的是,auto定義的變數需要
顯式的初始化,不然其值是一個取值範圍內的任意值,千萬別指望是0!。
int main(void)
{
int repid; //auto定義的變數需要顯式的初始化,不然其值是一個取值範圍內的任意值;
int tents = 5;
}
register變數:
與普通變數相比,register的訪問和處理速度更快。但是暫存器變數是無法獲取其地址的,因為其不是存在記憶體中。
和auto一樣,具有塊作用域,無連結,和自動儲存期;
static變數:
int paramater1; // 具有外部連結的靜態儲存期,其他檔案使用要用extern申明; static paramater2; // 具有內部連結的靜態儲存期,其他檔案不可使用; int function(void) { static int paramater3; //無連結的靜態儲存期, 記憶體會一直存在,但出了該函式後程序後就不能使用了。 }
const 和 volatile :
const 其值不能通過賦值,遞增,遞減修改;
1)const進行指標的限定:
const float *pf; //pf指向一個float型別的const值;指向的值是不能改變的,而pf本身是可以改變的。 float * const pf; //pf指向一個float型別的const值;建立的指標Pt不能改動,pt必須指向同一地址,但它所指向的值可以改變; const float *const ptr; //pf指向一個float型別的const值;建立的指標Pt不能改動,pt必須指向同一地址,它所指向的值也不可以改變; // 總結:const 放置在*之前,指的是指標不能改,放置在*之後,說明地址的資料不能改。
2)const 修飾實參,保證資料傳遞過程中資料不會被更改:
void display(const int array[], int limit);
3) const 修飾全域性變數:
全域性變數的一個缺點就是暴露資料,其他任何部分的程式都可以對其進行修改,因此用const修飾是一個不錯的選擇。
const 和 volatile :
volatile 限定符告知計算機,代理(非變數所在的程式)是可以改變其變數的值。最常用的用法是在硬體地址及其他程式或者同時執行的執行緒中共享資料。
好處在於:告訴編譯器不能對此變數進行優化;