结构体
结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体声明:
struct student //标签,可以省略但是尽量不要省略,方便阅读。 { char name[]; //结构体成员,c语言中不能为空 int age; char sex[]; char id[20]; }list; //变量列表,可以省略。 注意切记不要忘记分号。
结构体成员访问:
1、结构体变量访问成员。
2、结构体指针访问成员。
struct student { char name[]; int age; char sex[]; char id[20]; };struct student list;struct student *p;printf("%s",list.name);printf("%s",p->name);
结构体变量的定义和初始化:
结构体的定义和初始化很简单,可以类比数组的初始化。
struct student { char name[]; int age; char sex[]; char id[20]; }; struct student a={"zhangsan",20,"nan","001"}; //初始化
结构体内存对齐:
struct s1 { char c1; int i; char c2; }; printf("%d\n", sizeof(struct s1)); //我们发现结构体的大小不是6,所以结构体的大小不是简单的成员大小相加,而需要考虑内存对齐。
内存对齐规则:1、第一个成员在与结构体偏移量为0的地址处。
2、其他成员变量要对齐到对齐数的整数倍的地址处。对齐数=编译器默认的对齐数与该成员大小的较小值。
3、结构体的总大小为对齐数的整数倍。
4、如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体大小就是所有最大对齐数的 整数倍(包括嵌套结构体的对齐数)。
总的来说内存对齐就是拿空间换时间的做法。所以在设计结构体的时候,尽量将空间较小的成员放在一起。
结构体传参:
结构体传参时不会发生降维,如果传参时传递一个结构体对象,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降。所以结构传参时,要传结构体地址。
位段:
位段与结构体类似,但位段的成员类型必须是int、unsigned int 、signed int 或char
struct A { int _a:2;//只是用变量a的两个比特位 };
位段其实是压缩内存空间,用时间换空间,但是移植性较差。
枚举
枚举就是一一列举
enum Day//枚举的定义 { Mon; //{}中的内容 是枚举类型的可能取值,叫枚举常量。致谢常量都是有取值的,默认从0开始,依次递增1. Tues; Wed; Thur; Fir; Sat; Sun; };
优点:
1、增加代码可读性和可维护性。
2、枚举有类型检查,更加严谨。
3、防止命名污染(封装)。
联合:
联合是一种特殊的自定义类型,特征是这些成员公用同一块空间。
union Un //联合类型声明 { char c; int a; //联合的大小至少是最大成员的大小,且考虑内存对齐. };联合体的应用:求计算机是大端还是小端