儲存型別關鍵字

2022-09-16 08:12:14 字數 2428 閱讀 5465

變數的儲存型別是指儲存變數值得儲存器型別。

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 注意 是不存在儲存型別的問題,它們恆存在於靜態記憶體中。這裡所談的儲存型別,都是針對變數而言。將期望值放在可執行程式檔案中對應的部分,然後將此檔案裝入記憶體。當程式執行時,這些對應的區域中已經存好期望的值了。在 塊執...