【47】指针:函数的“多出口快递员”
函数输出三渠道,指针灵活最称奇。
全局隐蔽难寻觅,返回单一力不支。
指针直送指定处,多结果归一瞬时。
编程之道通天地,指针妙用展神技。
摘要
本文通过快递员比喻,解析指针如何让函数具备多个输出接口。通过加法、除法运算案例,对比全局变量、return
和指针三种输出方式的优缺点,验证指针在多结果返回场景中的灵活性。实验表明,指针可清晰传递多个结果,代码可读性高且无副作用。文档涵盖代码实现、测试验证及工程应用建议。
关键字
【函数输出接口】
【全局变量】
【return】
【指针输出】
【多结果返回】
引言
函数是程序的“模块”,需具备输入和输出接口。本文通过快递员比喻,演示三种输出方式(全局变量、return
、指针)的差异,重点解析指针如何实现多结果返回。文档结构如下:
- 函数输出的三种渠道
- 单结果与多结果案例对比
- 代码实现与验证
硬件设计
本方案为通用软件技术,不依赖特定硬件。数据存储于RAM,通过指针操作实现多结果返回。关键配置如下:
- 存储器映射:变量存储于RAM,指针指向具体地址。
- 端口配置:通过
View()
函数输出结果至串口(需外接调试设备)。
软件配置
采用分层架构设计:
模块划分
依赖关系
- BSP层:无硬件依赖,纯软件实现。
- 驱动层:
View()
函数需对接串口驱动。 - 应用层:主逻辑代码(
main.c
)。
代码实现
1. 函数的三类输出渠道
比喻:快递员送货方式
- 全局变量:像把包裹放在公共储物柜,双方需记住位置,但容易混淆。
return
:像快递员只能送一个包裹,无法一次送多个。- 指针:像快递员直接送货到指定地址,可同时送多个包裹到不同位置。
2. 单结果输出:加法运算
案例:3 + 5 = 8
方法1:全局变量
// 全局变量像公共储物柜
unsigned char He; // 存放结果的“储物柜”
void JiaFa() {
He = 3 + 5; // 放入储物柜
}
void main() {
JiaFa();
unsigned char DiaoYongZhe = He; // 从储物柜取包裹
}
缺点:全局变量隐蔽,易冲突,可读性差。
方法2:return
// return像单一快递箱
unsigned char JiaFa() {
return 3 + 5;
}
void main() {
unsigned char DiaoYongZhe = JiaFa(); // 直接接收快递箱
}
优点:简洁直观,但只能返回一个结果。
方法3:指针
// 指针像指定送货地址
void JiaFa(unsigned char *pu8He) {
*pu8He = 3 + 5; // 直接送货到指定地址
}
void main() {
unsigned char DiaoYongZhe;
JiaFa(&DiaoYongZhe); // 提供地址,快递员直接送货
}
优点:灵活,可指定任意地址,无副作用。
3. 多结果输出:除法运算
案例:5 ÷ 3 = 1余2
方法1:全局变量
// 全局变量需多个“储物柜”
unsigned char Shang, Yu;
void ChuFa() {
Shang = 5 / 3;
Yu = 5 % 3;
}
void main() {
ChuFa();
unsigned char DiaoYongZhe_Shang = Shang;
unsigned char DiaoYongZhe_Yu = Yu; // 需多个变量接收
}
缺点:全局变量过多易混乱,维护困难。
方法2:指针
// 指针像多个指定地址
void ChuFa(unsigned char *pu8Shang, unsigned char *pu8Yu) {
*pu8Shang = 5 / 3;
*pu8Yu = 5 % 3;
}
void main() {
unsigned char DiaoYongZhe_Shang, DiaoYongZhe_Yu;
ChuFa(&DiaoYongZhe_Shang, &DiaoYongZhe_Yu); // 一次调用返回两个结果
}
优点:清晰直观,可扩展任意数量结果。
4. 注意事项
原则 | 说明 |
---|---|
避免副作用 | 全局变量易引发隐藏问题,慎用。 |
指针类型匹配 | 指针类型需与目标变量类型一致(如unsigned char* 对应字节型变量)。 |
地址有效性 | 确保传递的地址合法,避免野指针。 |
测试验证
测试环境
- 硬件:STC8系列单片机,串口调试工具。
- 输入:
- 加法:3 + 5 → 预期结果8。
- 除法:5 ÷ 3 → 预期商1,余2。
测试结果
- 加法运算:
- 指针法输出
DiaoYongZhe = 8
。
- 指针法输出
- 除法运算:
- 指针法输出
DiaoYongZhe_Shang = 1
,DiaoYongZhe_Yu = 2
。
- 指针法输出
文件结构
Project/
├── Drivers/
│ ├── BSP/
│ │ └── bsp_uart.c // 串口驱动
│ └── Module/
│ └── arithmetic.c // 算术运算模块
├── User/
│ └── main.c // 主函数
└── Projects/
└── project.uvproj // Keil工程文件
扩展应用
- 传感器数据采集:同时返回温度、湿度、压力等多参数。
- 通信协议解析:从数据包中提取多个字段(如地址、数据、校验码)。
- 复杂算法:返回多个中间结果供后续处理。
结论
通过指针,函数可灵活实现多结果输出,优势如下:
- 清晰直观:通过参数指定地址,无副作用。
- 扩展性强:可返回任意数量结果,无需修改函数返回类型。
- 代码简洁:避免全局变量和多次调用
return
。
记住:指针是函数的“多出口快递员”,指定地址即可高效传递多个结果!
附:函数输出方式对比图
graph LR
A[函数] --> B[全局变量:隐蔽储物柜]
A --> C[return:单一快递箱]
A --> D[指针:多地址送货]
D --> E[灵活返回多个结果]
**记住**:指针是函数的“多出口快递员”,指定地址即可高效传递多个结果!
---
**附:函数输出方式对比图**
```mermaid
graph LR
A[函数] --> B[全局变量:隐蔽储物柜]
A --> C[return:单一快递箱]
A --> D[指针:多地址送货]
D --> E[灵活返回多个结果]