變數的儲存型別是指儲存變數值得儲存器型別。
c語言中變數可以存放在3個地方:普通記憶體
執行時的堆疊(堆疊也是記憶體,只是用來暫存資料內容變化非常頻繁)
cpu內部的通用暫存器
注意:程式設計師不能修改全域性變數的儲存型別,它只能是靜態的。
1.auto關鍵字=基本不用
2.register關鍵字=現在編譯器會自動分配
3.static關鍵字
3個不同的用途:
a.用於函式內部的區域性變數宣告時,static關鍵字的作用是改變區域性變數的儲存型別,從自動變數改為靜態變數,該區域性變數不再儲存在堆疊或暫存器中,而是編譯時由編譯器分配乙個靜態位址空間,但此變數的作用域不受影響,依然僅侷限在宣告它的函式內部才可訪問。
b.用於函式定義時,此函式就只能在定義改函式的c檔案中引用,該c檔案外的**將無法呼叫該函式。
c.用於全域性變數的宣告,作用類似於函式,此全域性變數的作用於將侷限在宣告該變數的c檔案內部,c檔案之外的**將無法訪問這個變數,如果採用指標的方式進行訪問是可以的
4.extern關鍵字
兩種使用方式:
一種是在c檔案中直接宣告某個其他檔案中定義的函式或者全域性變數為extern,從而告訴編譯器這個函式或者變數是在其他c檔案中定義的
二是在標頭檔案中宣告某個函式或變數為extern,然後在需要引用該函式或者變數的c檔案中包含該標頭檔案。
5.struct關鍵字
結構是由若干(可不同型別的)資料項組合而成的復合資料物件,這些資料項成為結構的成分或成員。
a.位域
位域是把乙個乙個位元組中的二進位制位劃分為幾個不同的區域,並說明每個區域的位數。每個域都有網域名稱,允許在程式中按網域名稱進行操作。這樣可以把幾個不同的物件用乙個位元組的二進位制位域來表示。位域的定義和位域變數的說明位域定義與結構定義相仿
形式:struct 位域結構名;例:
struct pack pk1, pk2;
結構變數pk1或者pk2的3個成員將總共占用16位儲存,氣質a占用2位,b占用8位,c占用6位。
例:struct bs
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
位域的長度不能大於1個位元組的長度,也就是說不能超過8位二進位制位。
b.結構體內部的成員的對齊
在計算機結構體長度(尤其用sizeof)時,需要注意根據不同的編譯器和處理器,結構體內部的成員有不同的對齊方式,這會引起結構體長度的不確定性。
1)結構體變數的首位址能幹被其最寬基本型別成員的大小所整除;
2)結構體每個成員相對於結構首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組
3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
6.union關鍵字
聯合變數的所有成員共享同一片儲存區,因此,乙個聯合變數在每個時刻裡只能儲存它的某乙個成員的值。
聯合變數也可以在定義時直接進行初始化,但這個初始化只能對第乙個成員進行。
例:定義乙個聯合變數,並進行初始化
union data
char n;
float f;
union data u1 = ; //只有u1.n唄初始化
使用聯合體來判斷cup的印第安序:
int checkcpu()
union w
int a;
char b;
}c;c.a = 1;
return(c.b == 1);
在linux上更加精煉的實現。如果endianness=『1』表示系統為little endian, 『b』表示big endian。
static union
char c[4];
unsigned long 1;
}endian_test = };
#define endianness((char)endian_test.1)
7.enum 關鍵字
列舉是一種用於定義一組命名常量的機制,以這種方式定義的常量一般稱為列舉常量。乙個列舉說明不但引進了一組常量名,同時也為每個常量確定乙個整數值。預設情況下其第乙個常量自動給值0,隨後的常量值順序遞增。
1)給列舉常量指定特定值
與給變數指定初始值的形式類似,如果給某個列舉量指定了值,跟隨其後的沒有指定值的列舉常量也將跟著順序遞增取值,知道下乙個有指定值的常量為止。
例:emun color;
2)用列舉常量作為陣列長度
typedef enumcolor;
float ballsize[color_num];
上例中當顏色數量發生變化時,只需要在列舉型別定義中加入或刪去顏色。無須修改color_num的定義,與大量使用#define相比既簡潔又可靠。如:
typedef enumcolor;
筆記13 儲存型別關鍵字volatile
1 volatile的字面意思 可變的。c語言中volatile用來修飾乙個變數,表示這個變數可以被編譯器之外的東西改變。編譯器之內的意思是變數的值的改變是 的作用,編譯器之外的改變就是這個改變不是 造成的,或者不是當前 造成的,編譯器在編譯當前 時無法預知。譬如在中斷處理程式isr中改變了這個變數...
new關鍵字 this關鍵字 base關鍵字
使用new,所做的三件事 1.類是引用物件,引用物件是在堆中開闢空間 在堆中開闢空間 2.在開闢的堆空間中建立物件 3.呼叫物件的構建函式 4.隱藏父類成員 子類的成員可以與隱藏從父類繼承的成員,類似於重寫。public new void sayhello this關鍵字的使用 1.代表當前類的物件...
儲存型別和static關鍵字作用小結
c中的儲存型別分為兩種,一種是靜態 static 另一種是自動 automatic 注意 是不存在儲存型別的問題,它們恆存在於靜態記憶體中。這裡所談的儲存型別,都是針對變數而言。將期望值放在可執行程式檔案中對應的部分,然後將此檔案裝入記憶體。當程式執行時,這些對應的區域中已經存好期望的值了。在 塊執...