✨Blog:不会敲代码的小张:)
推荐专栏:C语言、Cpp️、数据结构初阶
座右铭:“記住,每一天都是一個新的開始”
本章内容:《结构体、枚举、联合》的介绍✨
初阶结构体链接
结构体自引用是个什么东西?看名字应该可以猜出来一二,我们先来看看到底长啥样。
struct Node
{
int data;
struct Node* next//需要用指针
};
上面代码我们可以看出,结构体中有个结构体类型的指针,那么我们可以得出:结构体自引用 就是在结构体内部,包含指向自身类型结构体的指针 像很多数据结构的结构就需要结构体自引用
内存对齐是为了提高内存访问效率,比如32为机器,每个总线周期都是从偶数开始读取内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。
在32位机器上double占8个字节,char占1字节,int占4个字节,那么通常我们会认为这个结构体的大小是13个字节,事实果真如此吗?
struct type
{
double d;
char c;
int i;
};
位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int、char (属于整形家族)
2.位段的成员名后边有一个冒号和一个数字
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
struct S
{
char a : 4;//后面的数字用来限定成员变量占用的位数
char b : 5;
char c : 6;
};
枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如“星期”这个词就是一个枚举,星期一、星期二、 星期三、星期四、星期五、星期六、星期日就是这个枚举里面的成员。
enum Day//星期
{
Mon,//0
Tues,//1
Wed,//2
Thur,//3
Fri,//4
Sat,//5
Sun//6
};
这些成员都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏
枚举的优点
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
union Un
{
char c;
int i;
};
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
联合的大小至少是最大成员的大小,当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍