結構體,聯合體(共用體),列舉型別,位段,記憶體對齊

2021-08-19 13:51:16 字數 2447 閱讀 1135

struct  test  //關鍵字 struct,表示其是乙個結構體,後面是乙個可選的標記(test)

; //可以在分號前直接跟變數名,也可以在之後寫為struct test 變數名;

strcut test 的作用類似於int 或float的宣告。

若寫為:

typedef strcut test

test;//則說明可以用test代替strcut test,使用起來更加的方便簡潔。

test a;//宣告結構體變數a

初始化:

1)不可以在結構體內初始化。

2)可以在定義的同時初始化,先定義再逐個初始化,還可以將資料賦給指定的屬性

struct person    

;struct person p1 = ;

struct person p2;

p2.name = "xing";

p2.age = 6;

p2.heigth = 104;

struct person p3 = ;

訪問:

訪問成員,2種方式:

使用->,如p1->age

使用(*p1).age,注意必須用圓括號,因為.運算子比*的優先順序更高

聯合體

聯合的宣告與結構體類似,但是聯合的所有成員引用的是記憶體中相同的位置

不同時刻把不同的東西儲存在同乙個位置時,可以使用聯合。

union (聯合體)  

;//聯合體的大小為最大型別的大小。

列舉型別

列舉型別就是對整型資料起乙個別名,,這個別名可以是各種字元,甚至漢字,但是不能是整數。

enum

day;

在預設情況下,mon=0,其餘的按順序依次加一,

若給其中某個賦值,則其後面的同樣依次加一,前面的不變。

使用:

#include 

#include

typedef

enum weekdayweekday;

weekday test_enum()

int main()

位段:

引用總結於

位域的定義與結構類似,形式為:

struct 位域結構名

;

例如:

struct bs;
可以先定義位域再定義位域變數,也可以同時定義。(與結構體相同)例如:

struct bs data;
或者:

struct bs data;
說明data為bs變數,共佔四個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。總共佔了兩個位元組,但是int總共佔四個,僅僅是空餘了兩個位元組。

注意:

struct bs
在這個位域定義中,a佔第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,占用4位,c占用4位。

2) 由於位域不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度,也就是說不能超過8位二進位。

3) 位域可以無位網域名稱,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k;
使用位段時, 必須注意下列事項:

(1)在某些機器上, 位段總是作為 unsigned 處理, 而不管它們是否被說明成 unsigned 的。

(2)可以通過定義長度為0的位段的方式使下一位段從下一儲存單元開始。

(3)可以定義無名位段。

(4)位段的長度不能大於儲存單元的長度。

(5)位段無位址,不能對位段進行取位址運算。

(6)位段可以以%d,%o,%x格式輸出。

(7)位段若出現在表示式中,將被系統自動轉換成整數。

關於記憶體對齊的使用規則

1.前面的位址必須是後面的位址的整數倍,不是就補齊

2.整個struct的長度必須是最長位元組的正數倍!

3.如程式中有#pragma pack(n)預編譯指令,則所有成員對齊以n位元組為準(即偏移量是n的整數倍),不再考慮當前型別以及最大結構體內型別

注意:關於#pragma pack(n)的使用

(1)n必須是已有的大小 ,如:1,2,4,8 等

(2)如果指定的大小》預設的大小,是以預設的為準

(3)如果指定的大小《預設的大小,以指定的為準

結構體位段 列舉 聯合體(共用體)

位段,c語言允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單位的成員稱為 位段 或稱 位域 bit field 利用位段能夠用較少的位數儲存資料。位段的宣告和結構是類似的,有兩個不同 位段的成員必須是 int unsigned int signed int char 整形家族。位...

結構體 聯合體 列舉

1 結構體struct 結構體的作用 在網路協議 通訊控制 嵌入式系統的c c 程式設計中,我們要傳送的不是簡單的位元組流 char型陣列 二是多種資料組合起來的乙個整體,其表現形式是乙個結構體。使用struct的注意事項 1 下面看乙個題目 結果 6 12 這裡涉及到結構體的記憶體對齊方式。1 關...

結構體 聯合體 列舉

結構體 1.宣告乙個結構體型別的一般形式為 struct 結構體名 成員表列 如 struct student 表示可選項 注 宣告不是定義,故不可對成員列表中的成員進行初始化。定義別名 方法一 如 struct 結構體名 typedef struct 結構體名 別名 方法二 如 typedef s...