结构体
1、基本概念
构造类型:由已有的数据类型构成类型
数组:多个同种类型的数据构成的那么一种类型
特点:只能存放一种数类型
结构体:从来存放表示某种特定含义的一组数据,是对数据的封装而函数是对功能封装。
好处:提高代码的可读性 提高数据易用性
提高代码可维护性
2、结构体的定义
// 定义结构类型
struct 结构类型名称{
成员类型 成员名称;
...
};//必须加分号
// 通过结构体类型定义结构变量
struct 结构类型名称 结构体变量名称;
注意:结构体名称大写(命名规范)
3、定义结构体变量的多种方式(掌握)
第一种方式
struct Person{
int age;
double height;
};
struct Person p1;
即:
- 先定义结构体类型
- 定义结构变量
第二种方式:
struct Person{
int age;
double height;
} p1,p2;
即:
- 定义结构体类型的同时定义结构变量
注意:
结构体类型定义是不可以重名的
数组名称是不可以改变的
int nums[5];
nums =(int[5]){1,2,3,4,5};// 错误
4、 结构体初始化
方式一:一一赋值
p1.age = 10;
p1.name = "xx";
p1.height = 1.3;
方式二:整体赋值
赋值的时候,{}中元素的顺序与定义结构体时成员顺序相同
p1 = (struct Person){20,"小明",2.0};
方式三:在定义结构体的时候赋值
struct Person{
int age;
double height;
} p1{20,1.75}};
5、结构体与普通变量的区别
- 除了结构体没有声明外,其他的都一样
- 用法区别:struct Person 和 int使用是一样的
6、结构体的存储细节(理解)
- 结构体本身不占用存储空间,如同int一样
- 为了快速访问变量,结构体内部有一个补齐算法,默认情况下它一定是占用存储空间最大成员的倍数(一定是偶数)
- 我们自己指定结构体占用的空间:
例:
//指定一组占用多少字节
#pragma pack(8)
7、结构体类型的作用域(掌握)
和变量一样,即
- 在函数内部,结构类型作用域就如同局部变量一样
- 在外边定义的结构体类型像全局变量的作用域
- 作用域:从定义的那一行开始直到文件的结束
二、结构体数组
数组元素为结构体数组
1、定义结构体数组
结构类型 数组名称[元素个数];
2、结构体数组初始化
- 先定义结构体数组然后初始化
- 定义结构体数组的同时进行初始化
3、使用
如同int数组一样使用
注意:
- 一般情况下结构体类型都是定义在函数的外部
- 如果没有显式初始化的结构体,那么这个结构体中所有成员都会被初始化为0
四、结构体指针
指向结构体的指针
1、定义结构体指针
格式:
结构类型 * 指针变量名称;
如:
struct Student stu = {"大木",60,59};
// 定义结构体指针
struct Student *sp1;
sp1 = &stu;
// 定义的同时进行初始化
struct Student *sp = &stu;
2、通过指针访问结构体成员
// 第一种方式:通过指针访问结构体的成员的
(*sp).score = 60;
// 第二种方式(重点)
sp->name = "小木";
sp->no = 59;
五、结构体嵌套
1、 结构体不可以嵌套自己,不能有字节这种类型的成员
2、结构体可以嵌套自己类型的指针
六、结构体与函数
1、结构体变量作为函数参数是值传递
2、结构体指针作为函数参数是地址传递
3、结构体数组作为函数参数是地址传递
七、枚举
一个个列出来,穷举
1、枚举作用:消除魔法数字
2、使用场景:当某个东西只有那么几个取值时候就是用枚举
3、定义枚举格式
enum 枚举类型的名称{
元素,//逗号
...
};
如:
//定义性别枚举类型
enum Sex{
Man,
Woman,
Other
};
注意:
- 枚举定义之后,后面不可定义与成员相同名称的
- 这里不能把要给数字赋值给一个枚举类型的变量,这样枚举存在的意义就没了
- 可以指定枚举中每一个元素值,如果前面的元素指定了值后面元素没有指定值则是前面元素的值加1,
如:
enum Season{
Spring = 2,
Summer,
Autumn,
Winter,
SOther = 9
};