在c語言中,有一種型別聽著很任性,叫做自定義型別。顧名思義,這種型別是程式設計師自己定義的一種型別,它和陣列很相似,但也有一些區別。自定義型別包含以下幾種:①結構體 ②列舉 ③聯合
結構體就是將具有不同或相同的型別放在一起的聚合型別。
可能聽著有些像順口溜,上一段**,捋一捋。
struct peo
a;
在**中我們定義了乙個結構體,分開一一解讀,peo是結構體的標籤(可以省略,但不建議省略)花括號內的是結構體的成員,可以有各種型別,a是結構體的名字。
結構體訪問有兩種方法: ①點操作訪問 如:a.age; ②-> 訪問 用於結構體指標的訪問,比如:struct peo *p=&a;p->a;
這裡定義了乙個結構體指標。
除此以外,我們還可以用 typedef struct來定義乙個結構體,例如:
typedef struct node
node;
在了解結構體如何定義的情況下,還應該知道結構體如何賦值:
node=; 由於我們用typedef 定義的結構體,因此這裡node就是可以直接表示結構體,不用再次宣告。
結構體如同陣列一樣,不能整體賦值,但可以整體初始化。
結構體有乙個比較特殊亦或是比較奇怪的地方,就是結構體的記憶體對齊:
struct s1
;printf("%d\n",sizeof(struct s1)); //12
struct s2
;printf("%d\n",sizeof(struct s2));//8
以上兩段程式,內容一樣,只是調整了順序,最後列印出來的結果卻不相同,若有異議,讀者可自行實驗。
這裡是因為結構體有記憶體對齊的特質,所以輸出結構不同。
結構體的記憶體對齊規則如下:
1、第乙個成員在與結構體變數偏移量為0的地質處。
2、其他成員變數要對齊到(對齊數)的整數倍位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。
在vs中預設值為8,linux預設值為4
3、結構體總大小為最大對齊數的整數倍。
4、若巢狀了結構體情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍。
掌握了這個規則,關於結構體的對齊數大體就不在話下了。 私下勤加練習,掌握的會蠻快的。
博主認為,結構體的記憶體對齊就是用空間來換取時間,有利有弊。
在結構體傳參過程中,應當盡量傳遞結構體的位址,而不是將結構體整體作為引數傳遞過去。
因為在函式形參例項化的時候,會形成棧幀,當結構體過於龐大時,特別費時間,導致效能下降。
(關於函式傳參詳細過程,讀者可自行參考 此篇部落格
列舉: 列舉也只自定義型別中的一種,列舉顧名思義就是一一枚舉。
enum day
;
列舉型別定義如此,{}裡面的內容是列舉型別的可能取值,也叫列舉常量。
我們可以用#define定義常量,但相比較,列舉有如下有點:
1.增加**的可讀性和維護性。
2.列舉有型別檢查,更加嚴謹。
3.防止了命名的汙染。
4.便於除錯。
5.使用方便,一次可以定義多個常量。
聯合(共用體):
聯合的特徵是成員公用同一塊空間,即所有成員的位址都是一樣的,是第乙個位元組的位址。
//聯合型別的宣告
union un
;
關於聯合大小的計算:
①聯合的大小至少是最大成員的大小。
②當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
(關於對齊數的概念,在結構體中我們已經介紹過,這裡就不必贅言過多。)
C語言之結構體
一 什麼是結構體 結構體是不同型別的資料組合成乙個有機整體。例如 學生的學號 姓名 性別 成績 位址 這些都是乙個學生的屬性,把這些屬性組織成乙個組合,組合中包含不同的資料型別,c和c 允許指定這樣的資料型別,稱為結構體。struct student 申明乙個結構體型別 struct是結構體申明的關...
C語言之結構體
在c語言中,可以使用結構體 struct 來存放一組不同型別的資料。結構體的定義形式為 struct 結構體名 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 請看下面的乙個例子 struct stu stu 為結構...
c語言之結構體
結構體 為什麼需要結構體 為了表示一些複雜的事物,而普通的基本型別無 法滿足實際需求。什麼叫結構體 把一些基本型別資料組合在一起形成的乙個新的復合資料型別,這個叫結構體 如何定義結構體 第一種方式 這只是定義了乙個新的資料型別,並沒有定義變數 struct student 第二種方式 struct ...