結構體 聯合 列舉

2021-08-16 13:39:11 字數 1935 閱讀 8282

一般的,在宣告乙個結構提示要使用struct關鍵字,例如:建立乙個學生

struct stu

char name [20] ;//名字

int age ;//年齡

char *** [5] ;//性別

char id[20] ;//學號

};//!分號不能丟

結構體得特殊宣告(沒有結構體名):

structx;
沒有結構體的標籤,就不能在結構體建立完成之後再建立變數,所以必須在建立結構體是就建立出變數,例如上述**的x變數

結構體的成員可以是標量、陣列、指標、甚至是其他結構體,但是不能是自己的乙個結構體建立的變數,原因在於這個結構體無法計算自己的大小。

結構體變數的成員是通過成員操作符(.)訪問的,(.)接受兩個運算元,以上面stu結構體舉例:

struct stu s; 

s.age = 20;

補充:在建立乙個結構體變數時寫struct stu s; 較為繁瑣,所以在建立結構體時在struct關鍵字前面加上typedef,在最後的分好前加上乙個新名字,這樣就是結構體變數的建立較為簡潔,如下:

typedef struct stustu;

stu s;

s.age = 20;

structstu//型別宣告

;struct stu s = ;

struct noden1 = ,null} ;

struct node n2 = ,null};

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

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

對齊數 = 編輯器預設的乙個對齊數 與 該成員大小 的較小值

vs中預設是8

linux中預設是4

3、結構體大小為最大對齊數(每個成員變數出了第乙個成員都有乙個對其數)的整數倍

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

1、平台原因(移植問題)

不是所有平台都能訪問任意位址處的任意資料,某些硬體平台只能在某些位址處取特定型別的資料,否則丟擲硬體異常

2、效能原因

資料結構(尤其是棧)應該盡可能放在自然邊界上對齊,原因在於,為了訪問未對齊的記憶體,處理器需要兩次訪問記憶體,而對齊的記憶體只需要一次訪問。

總的來說:結構體的記憶體對齊是拿空間換時間的做法

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

1、成員必須是int、unsigned int 和signed int

2、位段的成員後面有乙個冒號和乙個數字

struct a
a就是乙個位段

a建立的變數的大小為8

列舉,顧名思義就是列舉,把可能的取值一一枚舉,定義如下:

enum day;
1、在沒有對其中的成員賦初值是,第乙個的值預設為0,後乙個比前乙個大1,如果對哪個成員賦值了,那麼這個被賦值的成員之後的成員比前乙個也大1。

2、建立好這個列舉之後,他的成員就是常量,可以對變數賦值,注意,列舉變數只能被列舉常量賦值,例:

enum day day = sun;
1、增加**的可讀性和可維護性

2、列舉有型別檢查,比#define更加嚴謹

3、放置命名汙染

4、便於除錯

5、使用方便,一次定義多個常量

聯合中,所有的成員共用一塊記憶體空間,聯合的大小至少是最大成員的大小,定義如下:

union un;
#includeunion un;

int main()

結構體,列舉,聯合

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

結構體,列舉,聯合。

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

結構體列舉與聯合

基本介紹 struct是結構體的關鍵字,它將一些相關聯的資料打包成乙個整體,這些相關聯的資料可以是不同的型別。它們被稱為結構體的成員,結構體的成員可以是標量 陣列 指標 或者是其他結構體。結構的宣告 假設我們要建立學生檔案,要納入學生的姓名,年齡和性別三個內容。那麼我們可以通過建立乙個結構體來實現這...