結構體 聯合體 列舉

2021-07-25 13:50:15 字數 2296 閱讀 3774

1、結構體struct

結構體的作用:在網路協議、通訊控制、嵌入式系統的c/c++程式設計中,我們要傳送的不是簡單的位元組流(char型陣列),二是多種資料組合起來的乙個整體,其表現形式是乙個結構體。

【使用struct的注意事項】

1、下面看乙個題目

結果:6 、12;

這裡涉及到結構體的記憶體對齊方式。

1、關於結構體資料儲存的對齊問題

在結構體中對齊方式是看最大的資料型別的位元組大小來訪問的。

但在gcc 編譯器中支援1、2、4個位元組的對齊方式。

2、設定記憶體對齊的方式。

#pragma pack()//設定記憶體對齊大小。

struct node

;#pragma pack();

3、結構體的記憶體對齊方式可以提高程式的效能,但是同時也會產生記憶體空洞。

下面有乙個特殊的

struct node

link;//sizeof(link)結果為12

2、共用體union

1、共用體的定義

2、共用體的記憶體對齊方式按最大位元組大小的資料型別來對齊。但產生的問題是資料覆蓋。

輸出結果為256

3、共用體與結構體的區別

【共用體與結構體的區別】

結構體大小:

結構體內部的成員,大小等於最後乙個成員的偏移量+最後乙個成員大小+末尾的填充位元組數。

結構體的偏移量:某乙個成員的實際位址和結構體首位址之間的距離。

結構體位元組對齊:每個成員相對於結構體首位址的偏移量都得是當前成員所佔記憶體大小的整數倍,如果不是會在成員前面加填充位元組。結構體的大小是內部最寬的成員的整數倍。

共用體

#include 

//gcc讓不同型別的變數共享記憶體位址 ,同一時間只有乙個成員有效

union data;

int main();//初始化時只填寫乙個值。(同一時間只有乙個成員有效)

data_1.b = 'c';

data_1.a = 10;//後賦值的才有效。前面的賦值被覆蓋

//列印位址,發現指向同乙個位址

printf("%p\n%p\n%p\n",&data_1.a,&data_1.a,&data_1.a);

return

0;}

共用體詳解

【擴充套件】大小端位元組序的問題

cpu的屬性問題:大小端cpu都是從低位址存放位元組。

小端cpu:把低位元組放在低位址。

大端cpu:把低位元組放在高位址。

【如何使用共用體測試機器的大小端格式?】

3、列舉enum

列舉實際上定義了一系列的整數巨集,並且只能定義整數巨集。

巨集在預處理階段進行,比較靈活,能夠定義函式、常量和其他。

結構體 聯合體 列舉

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

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...

結構體,聯合體和列舉型別

一.結構體 結構體資料的存放 位段的缺點 不具有跨平台性 二.聯合體 三.列舉型別 若沒有位段 先找預設對齊數和每個數的較小值,再在這些較小值中找出最大的,即為最大對齊數.若上個對齊數開闢的空間還有冗餘可以放下下個數,就把下個數也放在這個空間內,如果不夠放下下個數,就把下個數放到下個空間內.當結構體...