嵌入式系统中void指针与函数指针的高级应用
void指针与函数指针在嵌入式系统中的高级应用1. void指针的工程应用1.1 void指针的本质特性void指针(void*)在C语言中表示一个不知道类型的指针变量其核心特性在于int nums[] {3, 5, 6, 7, 9}; void* ptr1 nums; int* ptr2 (int*)nums; printf(%d,%d\n,ptr1,ptr2);这段代码展示了void指针与int指针的关键区别存储相同的地址值无法直接进行取值操作(*ptr)不支持指针算术运算(/--)必须显式类型转换后才能进行内存访问1.2 内存操作函数实现标准库中的memset函数是void指针的典型应用void mymemset(void *data, int num, int byteSize) { char* ptr (char*)data; for(int i0; ibyteSize; i){ *ptrnum; ptr; } }实现要点使用char指针进行逐字节操作byteSize参数确保操作边界安全适用于任何内存区域包括结构体typedef struct _Person { char* name; int age; } Person; Person p1; mymemset(p1, 0, sizeof(Person));2. 函数指针的工程实践2.1 基本定义与使用函数指针允许将函数作为参数传递实现回调机制typedef void (*intFunc)(int i); void test1(int age) { printf(test1:%d\n,age); } int main(void) { intFunc f1 test1; f1(8); // 通过指针调用函数 return 0; }2.2 实现通用遍历算法模拟foreach功能分离遍历逻辑与数据处理void foreachNums(int *nums, int len, intFunc func) { for(int i0; ilen; i){ func(nums[i]); } } void printNum(int num) { printf(value%d\n,num); } // 调用示例 int nums[] {1, 5, 666, 23423, 223}; foreachNums(nums, sizeof(nums)/sizeof(int), printNum);3. 综合应用案例3.1 通用最大值查找算法typedef int (*compareFunc)(void *data1, void *data2); void* getMax(void *data, int unitSize, int length, compareFunc func) { char* ptr (char*)data; char* max ptr; for(int i1; ilength; i){ char* item ptri*unitSize; if(func(item,max)0){ max item; } } return max; }支持多种数据类型的比较函数// 整型比较 int intDataCompare(void *data1, void *data2) { int i1 *(int*)data1; int i2 *(int*)data2; return i1-i2; } // 结构体比较 typedef struct _Dog { char* name; int age; } Dog; int dogDataCompare(void *data1, void *data2) { Dog *dog1 (Dog*)data1; Dog *dog2 (Dog*)data2; return (dog1-age)-(dog2-age); }3.2 标准库qsort的自定义排序// 整型数组排序 int nums[] {3, 5, 8, 7, 6}; qsort(nums, sizeof(nums)/sizeof(int), sizeof(int), intDataCompare); // 结构体数组排序 Dog dogs[] {{沙皮,3},{腊肠,10},{哈士奇,5}, {京巴,8},{大狗,2}}; qsort(dogs, sizeof(dogs)/sizeof(Dog), sizeof(Dog), dogDataCompare);4. 嵌入式系统中的设计考量4.1 内存受限环境的优化避免过度使用void指针导致的类型不安全函数指针表实现状态机typedef void (*StateHandler)(void); StateHandler stateTable[] { idleHandler, initHandler, workHandler, errorHandler }; void runStateMachine(int state) { if(state 0 state sizeof(stateTable)/sizeof(StateHandler)){ stateTable[state](); } }4.2 硬件寄存器访问模式typedef struct { volatile uint32_t CR; volatile uint32_t SR; volatile uint32_t DR; } UART_TypeDef; #define UART0 ((UART_TypeDef*)0x40001000) void UART_Init(void (*callback)(char)) { // 初始化代码 UART0-CR | 0x01; // 使能UART // 设置回调函数 uartCallback callback; }5. 工程实践建议类型安全包装#define SAFE_CAST(ptr, type) ((type)(ptr)) void* buffer malloc(1024); int* intBuf SAFE_CAST(buffer, int*);回调函数注册机制typedef struct { void (*dataReady)(void* data, int len); void (*errorHandler)(int errCode); } DeviceCallbacks; void registerCallbacks(DeviceCallbacks* cb) { deviceCallbacks *cb; }混合使用范例void processSensorData(void* rawData, int len, void (*processor)(void*, int)) { // 数据校验 if(isValid(rawData, len)){ processor(rawData, len); } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2463138.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!