C 結構體 聯合體 列舉體及其記憶體

2021-10-09 12:14:47 字數 2403 閱讀 9963

結構體:是一種特殊形態的類

結構體與類的區別:結構體與類具有不同的預設訪問控制屬性:

在類中,對於未指定訪問控制屬性的成員,其訪問控制屬性為私有型別;在結構體中,對於未指定任何訪問控制屬性的成員,其訪問控制屬性為公有型。

關鍵字:struct

定義:

struct 結構體名稱

什麼時候用結構體而不用類:

1:主要用來儲存資料,而沒有什麼操作的型別

2:人們習慣將結構體的資料成員設定為公有,因此這時用結構體比較方便

如果:1:乙個結構體的全部資料成員都是公共成員;

2:沒有使用者定義的建構函式;

3:沒有基類和虛函式;

那麼這個結構體可以通過下列方式初始化:

型別名 變數名 = ;

例如:

struct student

;student wh=;

其中student為結構體的型別名;wh為結構體變數名

結構體的記憶體大小:

struct test1

m;

char 1位元組,int 4位元組, double 8位元組,所以以8位元組對齊,總位元組大小為8的倍數

8+4+1=13,而8位元組對齊後,為16。

再例如:

struct test2

n;

w[5]:5位元組,s[2]:8位元組,q:8位元組

5+8+8=21,對齊8位元組後為24

struct test3

s;s 的大小為24

typedef union  mat;

typedef struct like;

則語句 printf("%d",sizeof(like)+sizeof(mat));的執行結果是:52

聯合體

聯合體的全部資料成員共享一組記憶體單元,任何兩個成員不會同時有效

關鍵字:union

定義:

union 聯合體名稱

定義變數方法:在定義union聯合體名稱之後如:

union mark

wh;

或者先定義聯合體型別,再定義變數:

union mark

;mark wh;

初始化方法:wh.grade=』a』;或wh.pass=ture;或者wh.percent=90;

儲存方式:共享一組記憶體單元,每一項元素起始位址都一樣,都跟聯合體 union 的位址偏移量為0

例如:union mark

;

儲存方式:

mark

grade

pass

percent**

****

****

儲存空間:4位元組

聯合體的記憶體計算:此結構的容量要容納最大的乙個元素,而且要位元組對齊其他元素的大小

例如:

union u

;

union u中最大的是 9 個位元組的 s[9],但 9 不能被 4 和 8 同時整除,而16可以,且16比9大。

所以 聯合體所佔空間 為16 個位元組

union ca;  

int main(void)

由於 pc 機位小端序,因此 低位元組放低位址,同時a是全域性變數儲存在靜態儲存區,預設初始為0,對 x[2]賦值後,union c的位址空間的值為:

高位址0000 0000|0000 0000|0000 0001| 0000 1010 低位址(4個位元組的儲存空間)

所以輸出 1×2的八次方+1×2的三次方+1×2 = 266;

如是在函式體內定義變數則其記憶體的值是不確定的需要先將其清0

union u;  

int main(void)

列舉體

定義方法:

enum class 列舉型別名: 底層型別 ;

enum class typename1 ;

(不定義底層型別預設int,裡面的值分別對應0,1,2,3)

enum class typename2: char;

enum class typename3 ;(裡面的值分別對應4,5,6,7)

特點:強作用域,其作用域限制在列舉類中

轉換限制,列舉類物件不可以與整型隱式地互相轉換

可以指定底層型別

詳解見:

參考文章:

結構體 聯合體 列舉

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

結構體 聯合體 列舉

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

C 結構體 聯合體

結構體是特殊形態的類,與類的區別 結構體的預設訪問許可權是public,也就是說當你建立資料成員的時候,預設是屬於public類,存在的主要原因 與c語言保持相容。結構體 struct 學生資訊 include include include using namespace std struct s...