【47】指针:函数的“多出口快递员”

【47】指针:函数的“多出口快递员”

函数输出三渠道,指针灵活最称奇。
全局隐蔽难寻觅,返回单一力不支。
指针直送指定处,多结果归一瞬时。
编程之道通天地,指针妙用展神技。


摘要

本文通过快递员比喻,解析指针如何让函数具备多个输出接口。通过加法、除法运算案例,对比全局变量、return和指针三种输出方式的优缺点,验证指针在多结果返回场景中的灵活性。实验表明,指针可清晰传递多个结果,代码可读性高且无副作用。文档涵盖代码实现、测试验证及工程应用建议。


关键字

【函数输出接口】 【全局变量】 【return】 【指针输出】 【多结果返回】


引言

函数是程序的“模块”,需具备输入和输出接口。本文通过快递员比喻,演示三种输出方式(全局变量、return、指针)的差异,重点解析指针如何实现多结果返回。文档结构如下:

  1. 函数输出的三种渠道
  2. 单结果与多结果案例对比
  3. 代码实现与验证

硬件设计

本方案为通用软件技术,不依赖特定硬件。数据存储于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。

测试结果

  1. 加法运算
    • 指针法输出DiaoYongZhe = 8
  2. 除法运算
    • 指针法输出DiaoYongZhe_Shang = 1DiaoYongZhe_Yu = 2

文件结构

Project/  
├── Drivers/  
│   ├── BSP/  
│   │   └── bsp_uart.c // 串口驱动  
│   └── Module/  
│       └── arithmetic.c // 算术运算模块  
├── User/  
│   └── main.c // 主函数  
└── Projects/  
    └── project.uvproj // Keil工程文件  

扩展应用

  1. 传感器数据采集:同时返回温度、湿度、压力等多参数。
  2. 通信协议解析:从数据包中提取多个字段(如地址、数据、校验码)。
  3. 复杂算法:返回多个中间结果供后续处理。

结论

通过指针,函数可灵活实现多结果输出,优势如下:

  1. 清晰直观:通过参数指定地址,无副作用。
  2. 扩展性强:可返回任意数量结果,无需修改函数返回类型。
  3. 代码简洁:避免全局变量和多次调用return

记住:指针是函数的“多出口快递员”,指定地址即可高效传递多个结果!


附:函数输出方式对比图

graph LR  
    A[函数] --> B[全局变量:隐蔽储物柜]  
    A --> C[return:单一快递箱]  
    A --> D[指针:多地址送货]  
    D --> E[灵活返回多个结果]  


**记住**:指针是函数的“多出口快递员”,指定地址即可高效传递多个结果!  

---

**附:函数输出方式对比图**  
```mermaid  
graph LR  
    A[函数] --> B[全局变量:隐蔽储物柜]  
    A --> C[return:单一快递箱]  
    A --> D[指针:多地址送货]  
    D --> E[灵活返回多个结果]  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值