資料型別 對資料的操作 奇葩關鍵字

2021-07-25 12:33:11 字數 4463 閱讀 2367

一、亂世梟雄:static和extern:改變資料型別在記憶體中的位置或者改變作用域,作用在資料型別上

1、解釋:

在c的世界裡,不同**「國度」以.c檔案為國界分隔開來,在單個國家裡有不同函式占山為王,每個c程式世界裡只有乙個君主(main),main通過下傳指令(引數),呼叫各種軍閥(函式),來掌控。某軍閥(函式)心懷叵測,不想單純聽從於main的指揮排程,樹立了自己的政權旗幟static。static不同聽從於main的排程,自己做主,私藏金庫(空間)。不同的國家(不同的.c檔案)之間通過extern相互私通,傳遞訊息。

2、static:1)、修飾區域性變數:區域性變數存放在棧區,staic修飾的話,放在靜態資料區,生命週期從該語句塊執行結束變到了直到持續整個程式執行為止,生命週期儲存空間變 化,作用域沒有變化。

2)、修飾全域性變數,對於乙個修飾的全域性變數,它既可以在本原始檔中被訪問,也可以在同乙個工程的其他原始檔被訪問。如果對其中某個源程式檔案中的全域性變數  前加 static,則更改作用域,由原來的整個工程可見變為本原始檔存在。

3)、修飾函式:與修飾全域性變數類似,更改作用域。

3、extern:指當前變數或函式不是在本原始檔內宣告的,它是外部變數外部函式,試圖引用乙個外部宣告的全域性變數或函式時,可以在其前面加上extern。

1)、extern變數名

2)、extern函式:函式預設是外部的(在函式體內或函式體外宣告乙個外部函式,extern關鍵字可以省略),如果不想讓其他原始檔鏈結到,在函式前面加static。

*static:繼承中靜態屬性、靜態函式,存在在整個類裡而非單個物件

二、鐵布衫:const:改變資料型別的唯讀屬性,作用在資料型別上

1、修飾物件:readonly,不僅僅可以用來修辭基本型別,還可以修辭一些結構型別及其參合體,如陣列、指標、指標陣列、結構體陣列、結構體指標陣列等。

2、使用方法:將型別去掉,看const修辭誰,誰就擁有了鐵布衫誰就是readonly。(不包含指標常量和常量指標的辨析)

const int n=5;

int const m=10;

上述兩個變數n和m是同乙個型別,都是const int(整型恒量),c++規定:const關鍵字放在型別或變數名之前等價的。

3、const的位置(指標):常量指標和指標常量

const int *p;

int const *b;

int* const c=p;

第乙個和第二個是:常量指標:指向的內容是常量,指標本身可以修改,const int 型別指標(const直接修飾int)

第三個是:指標常量:指標本身是個常量,指標只向的內容可以修改,int型別的const指標

當const在*之前是常量指標,在*之後是指標常量

char ** p1;                               //指向char型別的指標的指標

const char **p2; //指向const char型別的指標的指標

char *const *p3; //指向char型別的const指標

const char *const * p4; //指向const char型別的const指標

char ** const p5; //指向char型別的指標的const指標

const char ** const p6; //指向const char型別的指標的const指標

char * const * const p7; //指向char型別const指標的const指標

const char * const * const p8; //指向const char型別的const指標的const指標

一些宣告是不能編譯通過的,因為需要在宣告的同時進行初始化。

*變數常量const、預處理指令#define

三、**刺客auto:區域性變數前特有的關鍵字,作用在變數上

解釋:c程式是面向過程的,在c**中會出現大量的函式模組,每個函式都有其生命週期(也稱作用域),在函式生命週期中宣告的變數通常叫做區域性變數,也叫作自動變數。會在記憶體棧上進行分配。

四、閃電飛刀:register:改變變數從記憶體到暫存器上,作用在變數上

1、作用:意味著該變數會作為乙個暫存器變數,讓該變數的訪問速度達到最快。例如,乙個程式邏輯中有乙個很大的迴圈,迴圈中有幾個變數要頻繁進行操作,這些變數可以宣告為register型別。

2、暫存器變數:暫存器變數是指乙個變數直接引用暫存器,也就是對變數名的操作的結果是直接對暫存器進行訪問。

3、 暫存器:是cpu的親信,cpu操作的每個運算元和操作結果,都用暫存器來暫時儲存,最後才寫入到記憶體或從記憶體中讀出。變數的值通常儲存在記憶體中,cpu對變數進行讀取先是將變數的值從記憶體中讀取到暫存器中,然後進行運算,運算完將結果寫回記憶體中。

4、使用暫存器變數請注意:

1)待宣告為暫存器變數型別應該時cpu暫存器所能接收的型別,意味著暫存器變數是單個變數,變數長度應該小於等於暫存器長度

2)不能對暫存器變數使用取位址符「&」,因為該變數沒有位址

3)盡量在大量頻繁操作時使用暫存器變數,且宣告的變數個數應該盡量少。

五、專一王子:volatile:每次都是從記憶體讀取,作用在變數上

解釋:不管它的值有沒有變化,每次對其值進行訪問,都會從記憶體裡,暫存器裡讀取,從而保證資料一致,做到表裡如一。

六、typedef:

1、作用:是為一種資料型別定義乙個新名字,

2、目的:一給變數乙個易記且意義明確的新名字,二簡化一些比較複雜的型別宣告。

3、typeof與define比較:define是簡單的字串替換,而typedef則是為乙個型別起新名字。

4、typedef與結構體的使用

struct tag_node

;typedef struct tag_node *p_node;

5、typedef與複雜變數宣告

int *(*a[5])(int,char*);

typedef int *(*p_fun)(int,char*); //pfun是我們建立的乙個型別別名

p_fun a [5]; //使用定義的新型別來宣告物件,等價於int* (*a[5])(int,char*);

void (*b[10]) (void(*)());

typedef void (*p_fun_param)();

typedef void (*p_fun)(p_fun_param); //整體宣告為乙個新變數

p_fun b[10]; //使用定義的新型別來宣告物件,等價於void (*b[10]) (void(*)());

double (*)() (*pa)[9];

typedef double (*p_fun)();

typedef pfun (*p_fun_param)[9]; //整體宣告乙個新型別

p_fun_param pa; //使用定義胡新型別來宣告物件,等價於double(*)()(*pa)[9];

*給結構取別名

七、右左法則

1、解釋:從最內部的括號(第一次開始閱讀宣告時,必須從變數名開始)開始閱讀宣告,向右看,然後向左看。當碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。

int * (*(*fp1) (int) )[10];

從變數名開始——fp1

往右看,什麼也沒有,碰到了),因此往左看,碰到乙個*——乙個指標。

跳出括號,碰到了(int)—— 乙個帶乙個int引數的函式

向左看,發現乙個*——(函式)返回乙個指標

跳出括號,向右看碰到—— 乙個10元素的陣列

向左看,發現乙個*——指標

向左看,發現int——int型別

總結:fp1被宣告為乙個函式的指標,該函式返回指向指標陣列的指標

int *(*(*arr[5]) ()) ();
從變數名開始——arr

往右看,發現是乙個陣列—— 乙個5元素的陣列

向左看,發現乙個*——指標

跳出括號,向右看,發現()——不帶引數函式

向左看,碰到*——(函式)返回乙個指標

繼續向左,發現int——int型別

總結:arr被宣告為乙個函式的陣列指標,該函式返回指向函式指標的指標

C語言資料型別關鍵字

變數和常量 常量是設定好不變得量 變數是在執行過程中可以修改或者賦值的量 c語言關鍵字 指只用於語義定義的單詞不能用於其他用途 int short long char unsigned signed float double bool comlex imaginary 整數 整數是指沒有小數的數 關...

C語言 資料型別 關鍵字

字串結束標誌 0 strlen 函式用於獲取字串的有效長度,直到遇到 0 停止。int main printf d n strlen arr 結果應是返回值,因為沒有 0 printf d n sizeof arr 結果為3,3 1 return0 文字檔案末尾 eof 轉義字元 n 轉義字元,代表...

C語言資料型別關鍵字

最初 k r 給出的關鍵字 c90 標準新增的關鍵字 c99 標準新增的關鍵字 intsigned bool long void complex short imaginary unsigned char float double 資料來自 c primer plus p42 表3.1 c語言的資料...