自定义数据类型
含义:用户自己建立的数据类型
类别:结构体、共用体、枚举类型
问题:
比如,有5个学生,我们要保存他们的信息,这些信息包括学号、姓名、考试成绩。
我们如何写代码保存数据呢?
结构体类型声明
结构体:由不同类型数据组成的组合型的数据类型
为什么使用结构体:方便保存某类数据,比如学生、老师、班级等。
类型声明格式:
struct 结构体类型名
{
成员1;
成员2;
.......
}
结构体变量定义与访问成员
结构体变量定义格式一:struct 结构体类型名 变量名;
结构体变量定义格式二:在声明类型的时候定义变量
注:在格式二中,可以省略结构体类型名;相同类型的结构体变量可以相互赋值。
结构体变量访问成员:变量名.成员名
-
结构体变量的定义
-
访问成员,方式:
变量名.成员名
结构体变量的初始化
结构体变量的初始化:
struct 结构体类型名 变量名={初值1,初值2};
注意:初值的赋值要按照顺序。
typedef取别名
typedef取别名:
(1) typedef 类型 别名;
(2)typedef struct 类型名
{ 成员列表 } 别名;
注意:别名可以理解成小名。
结构体的嵌套
//学生
struct student
{
int id; //学号
char name[20]; //姓名
float score; //分数
}; //STU1是struct student的小名
//老师
struct teacher
{
int t_id; //老师的编号
struct student stu; //学生 定义学生变量,作为老师的成员
char t_name[20]; //老师的名字
};
//班级
struct class
{
int c_id; //班号
char c_name[20]; //班级名称
struct teacher t; //定义老师变量作为成员
};
结构体数组
结构体数组的定义:
(1) struct 类型名 数组名[数组长度];
(2)在声明结构体类型时,定义结构体数组。
结构体数组访问成员格式:
数组名[下标].成员名
//学生
typedef struct student
{
int id; //学号
char name[20]; //姓名
float score; //分数
}STU;
STU stu[3]; //stu是数组,是struct student类型的数组
//数组元素相当于变量
//数组名[下标].成员名
stu[0].id = 1;
strcpy(stu[0].name, "刘备");
stu[0].score = 100.0f;
stu[1].id = 2;
strcpy(stu[1].name, "关羽");
stu[1].score = 90.5f;
stu[2].id = 3;
strcpy(stu[2].name, "张飞");
stu[2].score = 80.5f;
for (int i = 0; i < 3; i++)
{
printf("%d %s %.2f\n", stu[i].id, stu[i].name, stu[i].score);
}
结构体数组的初始化:
struct 类型名 数组名[数组长度]={
{初值11,初值12,......},
{初值21,初值22,......},
......
} ;
结构体的大小
对齐机制:往最大的类型对对齐
- 例1
- 例2
因为最大的字节为八个字节(double),首先先分配八个字节给int,但是int只使用了四个字节,后面还有四个字节装不下double,于是又分配八个字节给double,刚好装满,最后还有一个char,再分配八个字节给char,但是char只占一个字节,最后还有7个字节未使用。结果导致共有11个字节未使用,造成资源浪费。
- 例3:消除资源浪费——把大的类型往上放
因为最大字节为八个字节(double),首先会分配给八个字节给double,double刚好装满,再分配八个字节给int,int只占四个字节,剩余四个字节,而char只占一个字节,刚好可以装下,只剩余三个字节未使用。
共用体
共用体的含义:相同的内存,存放不同的变量(成员)
共用体的特点:所有成员共用里面最大成员的空间,同一时刻,只能保存一个成员值。
注:共用体在语法上与结构体是一致的,只不过内存结构不一样。
共用体类型的声明:
union 共用体类型名
{ 成员列表; };
共用体变量的定义:
与结构体变量的定义一致,只不过关键字不同
共用体变量访问成员:
共用体变量名.成员名
数据发生改变的原因是因为int和char有公共的内存空间,当给char的变量赋值时,会修改内存数据,也就是把之前写入的id值修改了
枚举类型
枚举的含义:把所有的可能都例举出来,然后再进行一个选择。
枚举类型的使用:为了提高程序的可读性、可维护性。
内存大小:与int一样大。
枚举类型的声明:
enum 枚举类型名{枚举列表};
注意:枚举列表是常量,里面的常量使用符号表示,并且可以在声明时赋值。默认情况:从0开始,依次加1。
如果right没有赋值,则会根据前面left加一,也就是Ascii码值加一