mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
2024年10月10日 16:04
This commit is contained in:
parent
41ef712d0c
commit
5bba8d4b86
BIN
docs/notes/02_c-leap/07_xdx/assets/5.png
Normal file
BIN
docs/notes/02_c-leap/07_xdx/assets/5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
BIN
docs/notes/02_c-leap/07_xdx/assets/6.png
Normal file
BIN
docs/notes/02_c-leap/07_xdx/assets/6.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 142 KiB |
BIN
docs/notes/02_c-leap/07_xdx/assets/7.png
Normal file
BIN
docs/notes/02_c-leap/07_xdx/assets/7.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
@ -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 <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明学生的结构体
|
||||||
|
*/
|
||||||
|
struct Student {
|
||||||
|
int id; // 学号
|
||||||
|
char name[20]; // 姓名
|
||||||
|
char gender; // 性别
|
||||||
|
int age; // 年龄
|
||||||
|
char address[50]; // 地址
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
// 禁用 stdout 缓冲区
|
||||||
|
setbuf(stdout, nullptr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* 示例:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明猫的结构体
|
||||||
|
*/
|
||||||
|
struct Cat {
|
||||||
|
char name[20]; // 姓名
|
||||||
|
int age; // 年龄
|
||||||
|
char color[50]; // 颜色
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
// 禁用 stdout 缓冲区
|
||||||
|
setbuf(stdout, nullptr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* 示例:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明人类的结构体
|
||||||
|
*/
|
||||||
|
struct Person {
|
||||||
|
char name[20]; // 姓名
|
||||||
|
char gender; // 性别
|
||||||
|
int age; // 年龄
|
||||||
|
double weight; // 体重
|
||||||
|
};
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
// 禁用 stdout 缓冲区
|
||||||
|
setbuf(stdout, nullptr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* 示例:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明通讯录的结构体
|
||||||
|
*/
|
||||||
|
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 <stdio.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 声明员工的结构体
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 第三章:共用体
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user