結構體 列舉 聯合的用法

2021-10-10 19:03:36 字數 2091 閱讀 1748

二、列舉

三、聯合體

結構體的宣告如下例:

struct student 

;

注意:c 語言中要求, 結構體內部不能包含自己這種結構體型別的成員。如下**是不能編譯通過的。

struct school 

;

想象一下,以上**如何計算sizeof(school)呢?所以這種寫法顯然是不合理的。但是,可以通過指標的方式來寫,因為乙個指標所佔的空間是確定的。

struct school 

;

如何計算結構體的大小?這涉及到是乙個特別熱門的考點:結構體內存對齊。

首先得掌握結構體的對齊規則:

第乙個成員在與結構體變數偏移量為0的位址處。

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。 vs中預設的值為8。

結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

計算以下結構體的大小:

typedef

struct a a;

首先,偏移量為零的記憶體空間存放char。接下來要存放乙個int,由於預設對齊數為8,min(8,4),所以對齊數取4,即這個int變數要存放在4的整數倍的記憶體空間上,因此char接下來的3個位元組都被浪費掉。存放完int之後,再存放乙個char,由於min(8,1),故對齊數取1,直接存放即可。這時,總共占用了1+3+4+1=9個位元組。由於最終占用的位元組數要為最大對齊數(即4)的整數倍,所以再補3個位元組。故這個結構體總共占用12個位元組。

注:可以使用預處理指令#pragma修改預設對齊數。

#pragma pack(8)

//設定預設對齊數為8

位段的宣告和結構是類似的,有兩個不同:

1.位段的成員必須是 int、unsigned int 或signed int 。

2.位段的成員名後邊有乙個冒號和乙個數字。

如:

struct a 

;

位段a的大小計算如下:

結構體向最長的int(4位元組)對齊,前三個位段元素一共2+5+10位,不足4位元組,合起來佔4位元組,第四個位段元素30位,不足4位元組,佔4位元組。一共8位元組。

列舉顧名思義就是一 一枚舉。

把可能的取值一 一枚舉。

enum color//顏色

;

{}中的內容是列舉型別的可能取值,也叫列舉常量。這些可能取值都是有值的,預設從0開始,一次遞增1,當然在定義的時候也可以賦初值。如:

enum color//顏色

;

補充:

c語言中,列舉和int是等價的,但凡是int能支援的運算和操作,列舉同樣支援。

實際開發中聯合體的使用場景比結構體少很多。一些特殊場景才需要使用聯合體。比如,這個場景下要求某個記憶體空間可以按照多種不同的方式來理解的時候。以下**通過聯合體實現了ip位址的點分十進位制表示。

union ip  point;};

intmain()

以下**通過聯合體實現了判斷大小端。

int

isbigend2()

u; u.b =

0x11223344;if

(u.a ==

0x11

)return0;

}int

main()

結構體,列舉,聯合

結構體 1.結構體的建立 1 在構建結構體之前,必須要對結構體進行宣告。例 struct student 描述乙個學生,student為標籤 此處的分號不能丟,此處也可寫變數 2 成員訪問 2.1在 1 中的 struct student 相當於型別,比如 int型,struct student s...

結構體 聯合 列舉

一般的,在宣告乙個結構提示要使用struct關鍵字,例如 建立乙個學生 struct stu char name 20 名字 int age 年齡 char 5 性別 char id 20 學號 分號不能丟結構體得特殊宣告 沒有結構體名 structx 沒有結構體的標籤,就不能在結構體建立完成之後再...

結構體,列舉,聯合。

今天我們來學習一下結構體,列舉以及聯合等知識。一。首先從結構體開始,結構體與陣列一樣都是聚合型別。1.結構體的宣告 struct tag variable list tag 1 可以省略 2 見名思意 3 盡量不省略。member list 不能為空。variable list 可以省略。例如 描述...