【51】指针:指针的双向通道特性
七律 · 指针双向通道
指针通道双方向,入口出口共一方。
数据读写皆可行,数组修改显神通。
函数内外通信息,内存操作见真功。
嵌入式中常应用,高效灵活两相融。
关键字
【指针双向通道】、【数组修改】、【内存操作】、【函数接口】、【入口出口】
引言
在嵌入式系统开发中,指针作为函数参数时,默认具有双向通道特性,既可读取数据(入口),也可修改数据(出口)。本文档系统阐述C语言中指针作为双向通道的特性,通过求数组元素整数倍一半的案例,说明指针如何同时作为数据输入(入口)和输出(出口)。结合代码示例与测试验证,展示指针在函数中直接修改数组元素的实现方法,并强调其在嵌入式开发中的高效性与潜在风险。通过求数组元素整数倍一半的案例,详细说明指针的双向操作机制,并提供代码实现与测试验证流程。
硬件设计
本案例为纯软件设计,无需硬件支持。
软件配置
模块化架构
- BSP层:基础硬件抽象(未涉及)
- 驱动层:核心函数
halve_array()
实现 - 应用层:
main()
调用驱动函数并展示结果
依赖关系
- 无硬件依赖
- 需标准C库支持
代码实现
核心代码
/**
* @brief 指针双向接口函数,将数组元素整数除以2
* @param [in,out] data_buffer 指向数组首地址的指针
*/
void halve_array(unsigned char *data_buffer);
/** 全局变量命名规范(g_前缀) */
unsigned char g_data_buffer[4] = {4, 7, 16, 25};
/** 函数实现(简化版) */
void halve_array(unsigned char *data_buffer) {
data_buffer[0] = data_buffer[0] / 2; // 第一个元素除以2
data_buffer[1] = data_buffer[1] / 2; // 第二个元素除以2
data_buffer[2] = data_buffer[2] / 2; // 第三个元素除以2
data_buffer[3] = data_buffer[3] / 2; // 第四个元素除以2
}
/** 主函数 */
void main() {
halve_array(g_data_buffer); // 传递数组首地址
View(g_data_buffer[0]); // 输出结果
View(g_data_buffer[1]);
View(g_data_buffer[2]);
View(g_data_buffer[3]);
while(1); // 无限循环
}
流程图说明
graph TD
A[Main Function] --> B[Call halve_array()]
B --> C[Modify array elements]
C --> D[Return modified data]
D --> E[Display results]
测试验证
测试用例
输入数据 | 预期输出 | 实际输出 | 测试结果 |
---|---|---|---|
{4, 7, 16, 25} | {2, 3, 8, 12} | {2, 3, 8, 12} | 通过 |
调试方法
- 数据修改验证:
- 调用
halve_array()
前:g_data_buffer
值为{4,7,16,25} - 调用后:
g_data_buffer
值为{2,3,8,12}
- 调用
- 指针双向性测试:
unsigned char test_val = 10; halve_array(&test_val); // 单元素测试,结果为5
文件结构
Project/
├── Drivers/
│ └── Module/
│ ├── array_ops.c // 函数实现
│ └── array_ops.h // 函数声明
├── User/
│ └── main.c // 应用层代码
└── Inc/ // 头文件存放目录
扩展应用
1. 数组排序函数
/**
* @brief 冒泡排序函数,通过指针修改数组元素
* @param [in,out] data 指向数组首地址的指针
* @param [in] size 数组长度
*/
void sort_array(unsigned char *data, int size) {
for(int i=0; i<size; i++) {
for(int j=i+1; j<size; j++) {
if(data[i] > data[j]) {
unsigned char temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
2. 数据转换函数
/**
* @brief 数据加倍函数,通过指针修改目标数组
* @param [in] src 源数组指针
* @param [out] dst 目标数组指针
* @param [in] size 数组长度
*/
void convert_data(unsigned char *src, unsigned char *dst, int size) {
for(int i=0; i<size; i++) {
dst[i] = src[i] * 2; // 将源数据加倍并写入目标数组
}
}
总结
指针的双向通道特性在嵌入式开发中具有以下核心价值:
- 高效性:直接修改内存数据,避免额外拷贝开销
- 灵活性:适用于需要实时修改数据的场景(如传感器数据处理)
- 风险提示:需谨慎使用,避免意外修改关键数据
本案例通过halve_array()
函数展示了指针的双向操作机制,同时强调了以下规范:
- 命名规范:函数名
halve_array
、变量名g_data_buffer
符合英文命名规则 - 代码简洁性:通过简化代码减少冗余变量
- 可维护性:模块化设计便于功能扩展
开发者需根据实际需求权衡双向指针的高效性与安全性,必要时使用const
限定符限制接口方向。
- 命名规范:函数名
halve_array
、变量名g_data_buffer
符合英文命名规则 - 代码简洁性:通过简化代码减少冗余变量
- 可维护性:模块化设计便于功能扩展
开发者需根据实际需求权衡双向指针的高效性与安全性,必要时使用const
限定符限制接口方向。