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...