C 學習筆記day14 標準C語言

2021-08-19 02:03:25 字數 2794 閱讀 3731

之前的筆記提到過,全域性變數是可以讓這個程式的其他原始檔使用的,但是在使用前需要宣告,告知編譯器,這個全域性變數在其他的原始檔中,否則編譯器會報錯。

extern int num;

乙個全域性變數可能會被其他多個原始檔使用,如果每次都在要使用這個全域性變數的原始檔中宣告是比較不方便的。

由於全域性變數的這種宣告是不佔記憶體的,所以可以把它放在標頭檔案中,當其他原始檔包含這個標頭檔案的時候,就不需要在另外的做宣告了。(比如說,我在demo.c的原始檔中,建立了 int num;這個全域性變數,就可以把宣告extren int num;寫在demo.h中)

靜態全域性變數的作用域是在宣告它的那個原始檔內

結構體:

結構體是可以存放多個不同型別的資料型別,甚至可以是另外乙個結構體。

宣告:

typedef struct peoplepeo;

宣告結構體需要使用關鍵字struct

people是這個結構體的名稱

一對花括號內部的內容稱為這個結構體的成員變數

typedef 也是乙個關鍵字,是用於給型別起別名的

peo就是people型別的別名

由於別名的存在,整個宣告可以省略掉型別名稱變成以下形式:

typedef struct peo;

簡述一下為什麼這麼做,如果不適用別名,那麼整個結構體的名稱,應該是 struct people,這個型別用於宣告people型別的變數來說,實在是太長了,所以用別名peo代替了struct people。

宣告結構體的時候,它是不會占用任何記憶體的,因為它僅僅是個型別!就像int不會占用記憶體一樣。所以是可以把它寫在標頭檔案中的,這樣其他檔案只要包含了標頭檔案,就可以使用這種結構體型別。

初始化:

結構體的初始化和陣列非常的相似,當用結構體型別給宣告了乙個變數之後,可以像以下方式初始化。

peo bob=;

如果在花括號內寫了乙個0.則表示,全部成員變數初始化為0.

使用:

兩個同型別的結構體是可以直接賦值的!

peo bob = ;

peo jm = bob;

可以使用成員運算子表示結構體中的成員變數。

bob.name 或者 bob.age

注意,這裡的bob.name就可以當作乙個字元陣列處理,它表示第乙個元素的位址。

而bob.age就代表了乙個int型別的變數!也可以正常的使用。ps: bob.age = 10;

結構體指標!這是乙個非常非常重要的應用。

peo* p_peo = null;

這個樣子就是宣告了乙個peo型別的指標。

p_peo = &bob

(*p_peo).name == bob.name

p_peo -> name == (*p_peo).name

把指標指向乙個peo的變數的時候,上面的三種表示方式是等價的。使用結構體指標的時候,盡量使用 -> 這種方式(我也不知道為什麼,看起來最高端)。

結構體型別是可以當作函式的引數,形參和返回值的,但是一定要通過位址的方式去傳遞。

假設乙個結構體作為返回值,被調函式得先把這個返回值存在乙個暫存的地方,

如果呼叫函式要用這個返回值,還得把這個結構體從暫存的地方賦值到呼叫函式準備好的記憶體位址中。

兩次賦值,一旦結構體足夠龐大,就會拖累程式,浪費時間,浪費記憶體。

如果要使用結構體,一定要使用結構體的位址和結構體的指標用於函式間的引數傳遞。

這裡要介紹兩個典型的問題!

1、如果被調函式的形參是乙個結構體指標型別,然後背調函式不修改結構體內容,一定要加上const,這個細節很大程度上,能避免對結構體的誤操作。

2、如果被調函式的返回值是結構體指標型別或者結構體位址,而這個結構體是被調函式的區域性變數,一定要加上static關鍵字。區域性變數的位址即使傳出來也沒有用,函式結束後,這個區域性變數會被釋放,然後傳出來的這個位址上,到底是什麼東西,誰都不知道。所以一定要用static,將其宣告問靜態區域性變數,這樣就可以將它的生命週期延長到整個程式結束。即使被調函式結束,計算機也會為這個變數儲存這塊位址的內容。

最後,建議呼叫函式盡可能的為被調函式準備好變數,用於存放被調函式的返回值。

比較好的做法就是,在呼叫函式中建立好用於接受被調函式返回值的變數,然後把這個變數的位址通過實參的方式傳遞給被呼叫函式。

資料對齊和資料補齊

typedef struct peo;

peo bob=;

按照正常的理解方式,bob的記憶體大小應該是 1 + 4 + 4byte。

實際上不是這樣。計算機把記憶體分為4個byte一組。

乙個變數存放的位址,必須是這個變數型別所佔位元組大小的整數倍。

比如說,int型別,4byte,起始位置不能放在1,2,3的位置上。

所以bob的age變數,和name變數中間是空出了3byte,整個bob占用12byte。

這個叫做資料對齊。

typedef struct peo;

peo jm = ;

現在把name挪到後面。jm的大小還是12btye。

規定,結構體變數的占用記憶體大小,必須是佔記憶體位址最大的那個基本型別的成員變數的位址的整數倍。

上述結構體中,int最大,4btye。先按照正常的計算 4 + 4 + 1 = 9 byte,不是4byte的整數倍,所以補齊到12byte。這就是資料補齊。

C 學習筆記 day14

1 對檔案的分類 1 文字檔案 每個位元組都是有效的可顯示的ascii碼,getline 2 二進位制檔案 位元組是連續的,不能用vi more檢視檔案內容,read按位元組數讀取 write 100 是整數的100,佔4個位元組 100 是字元陣列,佔3個位元組 2 異常 1 人為錯誤 由於程式設...

C 基礎程式設計DAY14

百錢買百雞問題 雞翁一值錢五,雞母一值錢三,雞雛三值錢一,百錢買百雞,問雞翁 母 雛各幾何?include include include using namespace std int main end time clock cout time clock endl system pause re...

Java學習之路 day14

接著昨天的多型知識點總結 1.instanceof 物件型別的校驗,將返回乙個boolean值 instanceof 對型別進行判斷 animal animal new cat animal instanceof cat 判斷建立的animal是否為cat animal instanceof dog...