Day13 内容梳理:
目录
Chapter 9 复合类型(自定义类型)
9.1 结构体
(1)结构体变量定义、初始化
(2)嵌套结构体
(3)结构体赋值
(4)结构体和指针
(5)结构体做函数参数
9.2 共用体(联合体)
9.3 枚举
9.4 typedef 关键字
Chapter 9 复合类型(自定义类型)
9.1 结构体
有时需要将不同类型的数组组合成一个整体,比如学生的学号/姓名/性别/年龄等等。单独定义比较繁琐,所以可以用结构体表示,如下:
int stuNum;
char name[20];
char gender;
int age;
(1)结构体变量定义、初始化
一般将结构体的定义写在头文件中,这样每次导入头文件都无需重新定义结构体。
以student及其可能包含的内容为例,一下是定义变量的格式:
初始化变量并赋值一共有3种方法:
①逐个调用然后赋值:变量.变量名 = 值;
②直接赋值:单个变量 = {值1, 值2……};
③结构体名{
变量1 值1;
变量2 值2;
}
;如果是字符串数组,需要通过strcpy_s(结构体变量.变量名, "值")来赋值。
strcpy_s()函数属于<string.h>库,记得在开头加上#include<string.h>
(2)嵌套结构体
比如游戏中的人物信息和技能信息:
(3)结构体赋值
初始化一个结构体变量后,若使另一个结构体变量等于它,则两个都是独立的、互不干扰的。
(4)结构体和指针
可以用指针去打印成员变量。
“结构体指针->成员”这个形式等同于“结构体变量.成员”
(5)结构体做函数参数
①结构体的普通变量做函数参数:
void funct01(struct student temp){
//内容
}
②结构体的指针变量做函数参数:
void funct02(struct student* p){
//内容
}
③结构体数组做函数参数:
与指针相比,参数列表多一个数组长度参数length。
void funct03(struct student arr, int length){
//内容
}
④const修饰结构体指针形变参量
struct student* const p可以改变指针的指向,但改不了所指向内容的值。
void funct04(struct student* const p){
//可改变指针指向,但不可改变所指向的内容
}
而const struct student* p能改变所指向内容的值,但改变不了指针指向。
void funct05(const struct student* p){
//可改变内容,不可改变指向
}
9.2 共用体(联合体)
共用体(union)也叫“联合体”,是能在同一存储不同类型数据的类型,其所占的内存长度等于其最长成员的长度倍数(类似最大公倍数)。
共用体变量中,起作用的成员是最后一次存放的成员。每存入一个新成员,原有成员的值就被会覆盖。共用体变量的地址和它自己各成员的地址都是同一个,
下图中,先将int a赋值为100,打印正常。
再将float b赋值为5.5,发现int a的值变味了乱码证明联合体所有变量共享同个地址:
打印共用体各个变量的地址,发现都相同:
9.3 枚举
一一列举出来所有变量的值,而且变量的取值仅限于列举出的这些。
枚举类一般配合switch语句使用,常用于控制流程。
定义格式:
enum 枚举类的名字{
枚举值列表
};
枚举值是常量,无法在程序中用赋值语句再次赋值。可以规定值,也可以不规定,如下:
规定值之后就按照值来,输入1打印MON:
不规定值的话,就会像数组一样按下标来跳转,下图中输入1打印TUE而非MON:
9.4 typedef 关键字
用途:围殴一种已存在的数据类型(基本类型或自定义的类型)起一个新名字。它不能被用于创建新的类型。
和#define的区别:
typedef仅限于数据类型,无法用在表达式或具体的值上。
另外,#define发生在预处理阶段,而typedef发生在编译阶段。
还有一点需注意,用typedef关键字起的别名是淡蓝色的,而变量都是黑色的。
给变量的数据类型起别名,例子:
给结构体的数据类型起别名,例子: