感悟《C和指標》 3 資料

2021-06-26 10:32:56 字數 2407 閱讀 8203

所有的程式都對資料進行操作,本章對資料的各個方面進行了描述。特別是變數的三大屬性——變數的作用域、鏈結屬性和儲存型別決定了變數的「可視性」和「生命期」。

1.基本資料型別

c語言的基本資料型別包括整型、浮點、指標和聚合型別。

(1)整型家族。整型家族包括字元(char)、短整型(short int)、整型(int)、長整型(long int)和列舉型別(enum)。其中前四種型別還分為有符號型(signed)和無符號型(unsigned),而且每種資料型別根據是否有符號以及資料型別的長度決定了它所表示的整數的取值範圍,一般說來是short int <= int <= long int。在標頭檔案limit.h中存放有各種資料型別最大值和最小值的巨集定義常量,如int_max等。列舉型別是使用者自定義變數的一種方式,它的值為符號常量而不是字面值,這種型別的變數實際上是整型值,我們可以對符號常量進行顯式的賦值。

關於整形字面值:定義的整型字面值可以指定型別和進製。如17380ul指定無符號長整型數,0xcafe指定十六進製制值。

(2)浮點數家族。浮點數家族包括浮點型(float)、雙精度(double)和長雙精度(long double),三者表示的浮點數範圍的關係是:float <= double <= long double。

(3)指標型別。這裡要區分「指標」和「指標變數」的區別,「指標」其實就是「記憶體位址」,而指標變數是存放其他變數記憶體位址的變數。記憶體位址是沒有型別的,而指標變數就好像一種「過濾器」或者說「有色眼鏡」,你用不同的指標變數去"看"某段記憶體位址的值,看到的就是不一樣的,用char*看見的是1位元組的字元,用int*看見的是4位元組的整數。

(4)聚合型別。聚合型別就是指結構體(struct)和共用體(union)兩種結構。

2.基本宣告

宣告的形式就是「乙個或多個說明符  宣告表示式列表」。可以在宣告的同時初始化,要小心不要對任何變數或者函式造成隱式宣告。

3.typedef

typedef用於為資料型別指定新的型別別名,typedef在結構體的定義上用的最多,比如 typedef struct node_t node;此後我們就可以使用node來定義節點型別。

4.常量

c語言中使用「const」關鍵字來定義常量型別。常量型別既然是不可更改的物件,那麼它們就必須在宣告時初始化。const形參在函式呼叫時得到實參值。這個技巧常用於函式的定義,當使用者檢視函式宣告時,立刻就可以明白它的意圖——常量引數是不會被誤更改的。

const和指標聯絡起來時往往有令初學者費解的表示形式,閱讀這類宣告的訣竅就在「*」上,把星號前後的內容分開來讀就能明白了,舉例:

int *pi;     指向整形變數的指標;

int const *pci;     指向整型常量的指標(pci可以修改,*pci不可修改);     

int* const cpi;     指向整型變數的常指標(cpi不可以修改,*cpi可以修改);

int const *const cpci;     指向整型常量的常指標(cpci和*cpci都不可以修改)。

常量指標,故「abcdefg」[6]值為『g』。

5.作用域

變數宣告的位置決定了變數的作用域,作用域包括:檔案作用域、函式作用域、**塊作用域和原型作用域。

(1)檔案作用域。檔案作用域定義於所有**塊之外,表示該變數在宣告處一直到該檔案結尾都有效。

(2)函式作用域。乙個函式的所有語句標籤(用於goto語句)必須唯一。

(3)**塊作用域。定義在「{}」之間的變數具有該**塊的作用域,而且這些變數會覆蓋**塊外的同名變數。

(4)原型作用域。原型作用域適用於在函式原型中宣告的引數名。

6.鏈結屬性

(1)external屬性。指多個原始檔中的多個宣告對應同乙個實體。

(2)internal屬性。指同一原始檔內所有宣告同屬於乙個實體,不同原始檔內多個宣告對應多個不同實體。

(3)none屬性。指每個宣告都對應不同的實體

7.儲存型別

變數的儲存型別(storage class)是指儲存變數的記憶體型別。變數的儲存型別決定變數何時建立、何時銷毀以及它的值將保持多久。有三個地方可以用於儲存變數:執行時堆疊、硬體暫存器和普通記憶體,分別對應著三種儲存型別:自動變數(auto)、暫存器變數(register)和靜態變數(static)。

(1)自動變數。自動變數定義於**塊內部,它在**塊的結束位置自動被系統清除**。

(2)暫存器變數。暫存器變數是一種特殊的自動變數,它沒有記憶體位址,其值直接儲存於暫存器中,它的初衷是為了提高頻繁被訪問變數的訪問效率,不過這種變數的效率還是決定於編譯器。

(3)靜態變數。宣告於所有**塊的外部,它具有靜態屬性,並會被編譯器在呼叫main函式之前初始化(通常為0),函式呼叫時仍然保持前一次呼叫的值。

8.static關鍵字

static關鍵字對鏈結屬性原本為external的識別符號具有修改鏈結屬性(為internal)的效果,而對其他屬性的識別符號則是起到修改儲存型別(靜態)的作用。

《c和指標》筆記3

預設鏈結屬性,external,儲存於靜態記憶體 int a 5 預設鏈結屬性,其實extern是可以不要的,但是風格上加上關鍵字是有好處的,儲存於靜態記憶體 extern intb 因為加上了static,鏈結屬性從external變為internal,原始檔私有,儲存於靜態記憶體 static ...

《C和指標》學習筆記(3)

1.5 在之前的rearrange函式語句中,if columns col len.break 當字元的列範圍超過輸入行的末尾就停止複製,這種方式只適合列範圍以遞增順序排列的時候,請修改這條語句使列範圍不是按順序讀取的時候也可以完成任務。include include include define ...

C和指標讀書筆記 第3章(資料)

1.長整型至少和整型一樣長,而整型至少和短整型一樣長 char 乙個位元組 int 四個位元組 signed表示有符號數 unsigned表示無符號數,如果顯示的把變數宣告為signed和unsigned,可以提供程式的可移植性。2.如果乙個多位元組字元常量的前面有乙個l,那麼它就是寬字元常量。3....