C語言 自定義型別(結構體 位段 列舉 聯合)

2021-08-20 04:33:05 字數 2868 閱讀 9515

結構體是一些值的集合,這些值稱為成員變數。每個成員可以是不同型別的變數。

結構體所佔記憶體大小為其成員所佔記憶體之和。空結構體所佔記憶體大小為1位元組。

柔性陣列,結構體最後乙個成員允許是未知大小的陣列,用malloc函式進行動態記憶體分配。

結構體的宣告:

//例如描述乙個學生:

struct stu

;//特殊的宣告:在宣告結構的時候可以不完全的宣告

//例如:匿名的結構體型別

struct

x;//結構體的成員可以是標量、陣列、指標,甚至是其他結構體。

//結構體成員的訪問:結構體變數的成員是通過點操作符(.)訪問的。點操作符接受兩個運算元。

struct stu s;//定義結構體變數

s.age=20;//對成員進行定義

//結構體訪問指向變數的成員,當乙個結構體變數為指標變數時,如何訪問?

struct stu *ps;

//兩種方式:

(*ps).age=10;

ps->age=10;

5.結構的自引用:

//結構體的自引用一定通過指標

typedef struct node

node;

6 結構的不完整宣告

struct a

;struct b

;//上述為不完整的宣告,不知道a與b誰先放在前面,以下為解決方案

struct b;

struct a

;struct b

;

7 結構體變數的定義和初始化

struct point

p1; //宣告的同時定義了變數p1

struct point p2; //定義結構體變數p2

struct point p3=;//定義的同時可以賦值

//結構體的巢狀初始化

struct node

n1=,null};

struct node n2=,null};

8.結構體的記憶體對齊

struct s1

;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為12

struct s2

;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為8

struct s3

;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為16

//結構體巢狀

struct s4

;printf("%d\n",sizeof(struct s1));//取最大對齊數的整數倍為32

結構體傳參

struct s

;struct s s=,1000};

//結構體傳參

void print1(struct s s)

//結構體位址傳參

void print2(struct s* ps)

int main()

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

位段的成員必須是:int、unsigned int 、signed int或是char(屬於整型家族)型別。

位段的成員名後面有乙個冒號和乙個數字。

例如:

struct a

;//該位段型別的大小是多少?

printf("%d\n",sizeof(struct a)); //8

//如何計算的呢?

//2+5+10+30=47(bit)=6位元組

//該位段對齊數為4位元組,因此大小應為4的倍數,因此結果為8。

4.總結:

###列舉型別

將可能的取值一一枚舉,可能的取值都是有值的,預設從0開始,一次遞增1,也可以在定義的時候賦初值。

例如:

//定義顏色

enum color

;//型別重新命名

typedef enum ***

***;

//賦初值

enum color

###聯合(共用體)

聯合是一種特殊的自定義型別,這種型別定義的變數包含的一系列成員共用同一塊記憶體空間,這樣聯合的大小至少是最大成員的大小(注意:當最大成員的大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍)。

例如:

//聯合體的宣告

union un

;//聯合體的定義

union un un;

//計算連個變數的大小

printf("%d\n",sizeof(un));//4

printf("%d\n", &(un.i));//3014152

printf("%d\n", &(un.c));//3014152

//共用一塊空間,位址相同

un.i = 0x11223344;

un.c = 0x55;

printf("%x\n", un.i);//11223355

//由於共用乙個空間,所以i會因c發生改變。

//由聯合體的特點可以用聯合體判斷大小端

int check_sys()

un; un.i=1;

return un.c;//c可以代表i的前乙個位元組的位址。

}

c語言 自定義型別 結構體,位段,列舉,聯合

1.結構體的宣告 陣列是一組相同型別元素的集合,當我們想將不同的不同型別的元素組成乙個集合時,則可以用結構體來宣告。比如,我們想宣告乙個學生的資訊集合 struct student 記得一定要有分號喲!這時乙個新的型別產生了,名字就叫做 struct student。其中student是可以省略的,...

自定義型別 結構體 位段 列舉 聯合

include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...

自定義型別 結構體 位段 列舉 聯合

1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...