C語言總結5 自定義型別(結構體,列舉,聯合)

2021-09-24 02:43:10 字數 3034 閱讀 1612

1.結構體

struct stu

;

特殊宣告:

struct

x;struct

a[10],*p;

注意:上面兩個結構體省略了結構體標籤,編譯器會把上面兩個宣告當成兩個完全不同的兩個型別,因此p=&x是非法的

struct node

;

注意:

typedef struct

node;//這是結構體型別,不用開闢空間

struct

node;//這是結構體變數,需要開闢空間

struct point//型別宣告

p1;//宣告型別的同時宣告變數

struct point p2;//宣告結構體變數p2

struct stu

;struct stu s = ;//初始化

struct node

n1 = , null };//結構體巢狀初始化

typedef struct test

; long e;//4+4

}test;

結果為432(vs或者vc平台下)

但若是這樣:

typedef struct test

; long e;

}test;

在vc平台下就為8,因為在struct後面加上t,表示為型別,不開闢空間,所以沒有大小,但兩者在vs平台下都為432(編譯平台原因)

__ 如何讓結構體按照指定的對齊引數進行對齊__:

#pragma pack(n)
強制使其對齊模數為n

如何知道結構體中某個成員相對於結構體起始位置的偏移量?

size_t offsetof(structname,membername);
直接使用offsetof巨集,如何模擬實現呢?

#define my_offsetof(structname,memname)\

(size_t)&(((structname*)0)->memname)//'\'為續行符

分析:((structname*)0)表示有乙個指向結構體的指標,它的值為0,&(((structname*)0)->memname)表示取結構體中的成員,由於這個類的基址是0,結構體成員的位址就是其在結構體中的偏移量。

struct a

;

分析:它的大小為8,』:'後面的為bit位,a需要2個bit位,int型別表示開闢4個位元組,為32個bit位,還剩30個bit位,b需要5個bit位,剩25個bit位,c需要10個bit位,剩15個bit位,d需要30個bit位,不夠,重新開闢乙個int型別的空間,用掉30個bit位,剩2個,一共8個位元組。

再例如:

#pragma pack(1)

struct tag

;

分析:它的大小為6,先開闢乙個char型別的空間,為1個位元組,即8個bit位,a需要1個bit位,剩7個bit位,b需要2個bit位,剩5個bit位,c需要6個bit位,不夠,重新開闢乙個位元組,用掉6個bit位,剩2個bit位,d需要4個bit位,不夠,再開闢乙個位元組,用掉4個bit位,剩4個bit位,e占用乙個位元組,再開闢乙個位元組,f需要4個bit位,剩4個bit位,g占用乙個位元組,一共開闢了6個位元組,在以1對齊時,為6,以4對齊時,按照記憶體對齊第四條原則,還是6.

例如:

typedef struct test

test;

分析:結果為8,存在對齊

結論:位域有兩個限制條件:

1>不能跨位元組儲存

2>不能跨型別儲存

2.列舉

enum color

;

成員變數沒有賦值,預設從零開始依次遞增1,若賦值也遵循遞增1,例如:

enum enum_a

;enum enum_a enuma = y1;

enum enum_a enumb = b1;

int main()

分析:x1為0,y1為1,z1賦值為255,則a1為256,b1為257,結果為1和257

3.聯合體

union un

;

union un

;union un un;

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

大小為4

int check()

un; un.i = 1;

return un.c;

}int main()

else

printf("大端\n");

return 0;

}

union un1

;union un2

;int main()

分析:第乙個大小為8,arr佔5個位元組,int佔4個位元組,對齊到最大數的整數倍,為8,第二個大小為16,分析同上。

unsigned short *arr[10][10];

typedef union un

un1;

un1 st, *pst;

int main()

分析:arr為指標陣列,大小為整個陣列大小為400,st為聯合體變數,聯合大小為16,pst為聯合體指標,指標大小為4,*pst為聯合體指標解引用,為聯合大小16。

自定義型別 結構體

struct tag 結構體型別名稱 variable list 結構體變數 省略結構體型別名稱 匿名結構體型別 當省略掉結構體型別名稱時,就不能省略掉結構體變數,這樣是不合理的,所以一般我們不建議省略結構體型別名 struct x,y 全域性變數 struct a 20 p int main 注意...

C語言 自定義型別 結構體 列舉 聯合

二 列舉 三 聯合 1.結構體型別建立 struct stu 定義乙個學生結構體 分號不能丟 特殊的宣告 在宣告結構的時候,可以不完全的宣告 比如 匿名結構體型別 struct x struct a 20 p p x 非法,編譯器會把上面的兩個宣告當成完全不同的兩個型別 結構的不完整宣告 struc...

C語言 自定義型別 結構體,列舉,聯合

結構 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。struct tag variable list 宣告定義後所定義的成員變數 描述乙個學生 struct student 結構體的自引用 結構正確的自引用方式 struct node 2 typedef struct ...