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