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;
};
- 联合是共用同一块内存空间的,这样一个联合变量的大小至少是最大成员的大小。