C語言的自定義類型有三種:結構體、枚舉、聯合
一、結構體
1.定義:結構體是一些稱爲成員變量的值的集合,結構裏的每個成員可以是不同類型的變量。
2.聲明
struct tag
{
member-list; //成員列表
}variable-list;
例如描述一個學生:
struct Stu
{
char name[20];//名字
int age;
char sex[5];
char id[20];
}s;
3.結構體成員的訪問
結構體變量訪問成員通過點操作符進行,點操作符接受兩個操作數。
例如上面的描述學生結構體,可以用s.name等來操作。
4.結構體變量的定義和初始化
struct Stu
{
char name[20];
int age;
}s;
struct Stu s = {"zhangsan",20};
初始化如上述代碼所示。
5.結構體內存對齊規則
- 第一個成員在與結構體變量偏移量爲0的地址處。
- 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。 對齊數=編譯器默認的一個對齊數與該成員大小的較小值。
- 結構體總大小爲最大對齊數(每個成員變量都有一個對齊數)的整數倍。
- 對於嵌套結構體,嵌套的結構體對齊到自己的最大對齊數的整數倍數處,結構體的整數大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
struct S1
{
char c1;
int i;
char c2;
};
//這個結構體的內存爲12
二、位段
位段的聲明和結構是類似的,但有兩個不同:
- 位段的成員必須是int、unsigned int或signed int。
- 位段的成員名後邊有一個冒號和一個數字。
- 位段的空間上是按照需要以4個字節(int)或者1個字節(char)的方式來開闢的。
struct A
{
int _a:2; //_a需要2個bit位
int _b:5;
int _c:10;
int _d:30;
}
A就是一個位段類型。且佔8個字節。
三、枚舉和聯合
枚舉:
enum Color
{
RED = 1;
GREEN = 2;
BULE = 4
};
enum Color clr = GREEN;
clr = 5;
- enum是枚舉類型,{ }中的內容是枚舉類型的可能取值,也叫枚舉常量。這些可能取值都是有值的,默認從0開始,一次遞增1。並且在定義的時候也可以賦初值。
聯合:
union Un
{
char c;
int i;
};
- 聯合是共用同一塊內存空間的,這樣一個聯合變量的大小至少是最大成員的大小。