diff --git a/docs/notes/02_c-leap/07_xdx/assets/5.png b/docs/notes/02_c-leap/07_xdx/assets/5.png new file mode 100644 index 0000000..d8da3aa Binary files /dev/null and b/docs/notes/02_c-leap/07_xdx/assets/5.png differ diff --git a/docs/notes/02_c-leap/07_xdx/assets/6.png b/docs/notes/02_c-leap/07_xdx/assets/6.png new file mode 100644 index 0000000..08208a2 Binary files /dev/null and b/docs/notes/02_c-leap/07_xdx/assets/6.png differ diff --git a/docs/notes/02_c-leap/07_xdx/assets/7.png b/docs/notes/02_c-leap/07_xdx/assets/7.png new file mode 100644 index 0000000..c169ef6 Binary files /dev/null and b/docs/notes/02_c-leap/07_xdx/assets/7.png differ diff --git a/docs/notes/02_c-leap/07_xdx/index.md b/docs/notes/02_c-leap/07_xdx/index.md index 1ac4e7d..e7e504a 100644 --- a/docs/notes/02_c-leap/07_xdx/index.md +++ b/docs/notes/02_c-leap/07_xdx/index.md @@ -323,6 +323,213 @@ int main() { # 第二章:结构体(⭐) +## 2.1 概述 + +* C 语言内置的数据类型,除了几种原始的基本数据类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含`相同类型`的数据,实际使用场景受限。 + +## 2.2 为什么需要结构体? + +### 2.2.1 需求分析 1 + +* 现有一个需求,编写学生档案管理系统,这里需要描述一个学生的 信息。该学生的信息包括学号、姓名、性别、年龄、家庭住址等, 这些数据共同说明一个学生的总体情况。 + +![](./assets/5.png) + +* 显然,这些数据类型各不相同,无法使用数组进行统一管理。 + +### 2.2.2 需求分析 2 + +* 隔壁老王养了两只猫咪。一只名字叫小黄,今年 2 岁,橘色;另一只叫小黑,今年 3 岁,黑色。请编写一个程序,当用户输入小猫的名字 时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示老王没有这只猫。 + +![](./assets/6.png) + +### 2.2.3 传统的解决方案 + +* 尝试 ① :单独定义多个变量存储,实现需求,但是,多个变量,不便于数据的管理。 +* 尝试 ② :使用数组,它是一组具有相同类型的数据的集合。但在编程中,往往还需要一组类型不同的数据,例如:猫的名字使用字符串、年龄是 int,颜色是字符串,因为数据类型不同,不能用一个数组来存放。 +* 尝试 ③ :C 语言提供了结构体。使用结构体,内部可以定义多个不同类型的变量作为其成员。 + +## 2.3 什么是结构体 + +* C 语言提供了 struct 关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。 + +![](./assets/7.png) + +> [!NOTE] +> +> C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 + +## 2.4 声明结构体 + +* 语法: + +```c +struct 结构体名{ + 数据类型1 成员名1; // 分号结尾 + 数据类型2 成员名2; + …… + 数据类型n 成员名n; +}; +``` + +> [!NOTE] +> +> 结构体中可以包含以下数据类型: +> +> * ① 基本数据类型:整型、浮点型、字符型、布尔型。 +> * ② 指针类型。 +> * ③ 枚举类型。 +> * ④ 结构体类型: +> * 可以包含其他结构体作为成员(称为嵌套结构体)。 +> * 结构体指针。 +> * ⑤ 联合体类型。 +> * ⑥ 位域。 + + + +* 示例: + +```c +#include + +/** + * 声明学生的结构体 + */ +struct Student { + int id; // 学号 + char name[20]; // 姓名 + char gender; // 性别 + int age; // 年龄 + char address[50]; // 地址 +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + return 0; +} +``` + + + +* 示例: + +```c +#include + +/** + * 声明猫的结构体 + */ +struct Cat { + char name[20]; // 姓名 + int age; // 年龄 + char color[50]; // 颜色 +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + return 0; +} +``` + + + +* 示例: + +```c +#include + +/** + * 声明人类的结构体 + */ +struct Person { + char name[20]; // 姓名 + char gender; // 性别 + int age; // 年龄 + double weight; // 体重 +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + return 0; +} +``` + + + +* 示例: + +```c +#include + +/** + * 声明通讯录的结构体 + */ +struct Contact { + char name[50]; // 姓名 + int year; // 年 + int month; // 月 + int day; // 日 + char email[100]; // 电子邮箱 + char phoneNumber[15]; // 手机号 +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + return 0; +} +``` + + + +* 示例: + +```c +#include + +/** + * 声明员工的结构体 + */ +struct Employee { + int id; // 员工编号 + char name[20]; // 员工姓名 + char gender; // 员工性别 + int age; // 员工年龄 + char address[30]; // 员工住址 +}; + +int main() { + + // 禁用 stdout 缓冲区 + setbuf(stdout, nullptr); + + return 0; +} +``` + +## 2.5 声明结构体变量 + +### 2.5.1 概述 + +* 定义了新的数据类型(结构体类型)以后,就可以声明该类型的变量,这与声明其他类型变量的写法是一样的。 + +2.5.2 + + + +# 第三章:共用体 +