目录
以下自定义类型,均需要先声明后使用
一:结构体
1.结构体的声明
结构是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
1.1 常见的结构体声明方式
struct tag(struct是结构体的关键字,tag是可自定义的标签名)
{
member-list;//成员变量,根据具体的描述对象添加不同类型的变量
}variable-list;//variable-list是用此结构体类型创建的变量,属于全局变量,也可以不创建
例如描述一个学生:
struct Stu(struct是结构体的关键字,Stu是自定义的标签名)
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//分号
1.2 特殊的声明
省略结构体的标签名(匿名结构体类型)
比如:
1.3 结构的自引用
注意:必须使用指针
还有:注意typedef的是使用
1.4 结构体变量的定义和初始化
1.5 结构体内存对齐
首先,介绍一个宏:offsetof(type,member); 头文件<stddef.h>
type : 数据的类型
member: 数据的成员变量
功能:
此具有函数形式的宏返回数据结构或联合类型类型中成员相对于起始位置的偏移值(以字节为单位)。
返回的值是类型为 size_t 的无符号整数值。
相对于起始位置的偏移值是什么?(如下图)
举个例子如下:
为什么会出现上述结果?
这是因为结构体的数据在存储时要满足内存对齐,那具体的规则是怎样呢,别急,我们接着往下看。
为什么存在内存对齐
1.6 修改默认对齐数
1.7 结构体传参
2. 位段
认识位段的基本结构:
实例测试:
需要特别注意的地方:
二:枚举
枚举顾名思义就是一 一列举。
把可能的取值一 一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一 一列举。
性别有:男、女、保密,也可以一 一列举。
月份有12个月,也可以一 一列举
1.1 枚举类型的定义
书写示例:
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
比如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
1.2 枚举的优点
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 使用方便,一次可以定义多个常量
3. 便于调试
从上图不难看出,左边的写法更加直观一些。
#define也可以定义多个常量,但是一次只能定义一个,如果要和上图示左边达到同样的效果,那么就要写成:
#define Exit 0
#define Add 1
#define Sub 2
#define Mul 3
#define Div 4
虽然这样要繁琐一些
当然,合不合适,繁琐还是简易都不能一概而论,要根据具体场景的具体需要来确定,一般来说:枚举是用在有限个 已知的可能的取值可以一 一列举,且这些可能的取值一般都归为同一类描述同一个对象的时候,就像星期一到星期日描述的就是一周内有限的7个可能的取值,一月到十二月描述的就是一年内有限的12个可能的取值,等等,这些时候,用枚举就比较简便合适。
4. 和#define定义的标识符比较枚举有类型检查,更加严谨
而#define即使在C++下,也不会有任何的类型检查。
1.3 枚举的使用
三:联合(共用体)
1.1 联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
int main()
{
//初始化
un.c = 'a';
un.i = 10;
return 0;
}
1.2 联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。
列举一个应用:
判断当前机器的大小端存储类型:
1.3 联合大小的计算
好了,到这就结束了,如果我的分享对你有帮助的话,点赞关注加收藏或者把它分享给你的好友一起学习吧。
关注我,持续更新哟!