当前位置: 首页 > news >正文

C语言void指针与函数指针核心技术解析

揭秘C语言的void指针与函数指针应用

1. void指针解析

1.1 void指针基础特性

void指针(void *)在C语言中表示一个"不知道类型"的指针,它仅包含内存地址信息而不包含数据类型信息。与int型指针不同,void指针具有以下关键特性:

  1. 无法直接取值:编译器不知道从该地址开始读取多少字节数据
  2. 无法进行指针运算:不能使用++或--操作,因为不知道数据单位大小
  3. 必须类型转换:在使用前必须转换为具体类型的指针
int nums[] = {3, 5, 6, 7, 9}; void* ptr1 = nums; // int i = *ptr1; // 错误:void指针不能直接取值 int* ptr2 = (int*)nums; printf("%d,%d\n",ptr1,ptr2); // 输出相同地址 int i = *ptr2; // 正确:通过类型转换后取值

1.2 void指针的工程应用

void指针最常见的应用场景是通用内存操作函数,如标准库中的memset函数。我们可以实现一个自定义的mymemset函数来演示其工作原理:

void mymemset(void* data, int num, int byteSize) { char* ptr = (char*)data; // 转换为char指针(1字节单位) int i; for(i=0; i<byteSize; i++) { *ptr = num; // 逐字节填充 ptr++; } }

这个函数可以处理任何类型的数据:

// 应用于整型数组 int nums[20]; mymemset(nums, 0, sizeof(nums)); // 应用于结构体 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() { intFunc f1 = test1; // 函数指针赋值 f1(8); // 通过指针调用函数 return 0; }

2.2 函数指针实现抽象编程

函数指针可以实现类似高级语言的"回调"机制,下面模拟foreach功能:

void foreachNums(int* nums, int len, intFunc func) { int i; for(i=0; i<len; i++) { int num = nums[i]; func(num); // 回调处理函数 } } 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 通用最大值查找函数

结合void指针和函数指针,我们可以实现一个能处理任意数据类型的通用最大值查找函数:

typedef int (*compareFunc)(void* data1, void* data2); void* getMax(void* data, int unitSize, int length, compareFunc func) { int i; char* ptr = (char*)data; char* max = ptr; for(i=1; i<length; i++) { char* item = ptr + i*unitSize; if(func(item,max) > 0) { max = item; } } return max; }

针对不同类型实现比较函数:

// 整型比较 int intDataCompare(void* data1, void* data2) { int* ptr1 = (int*)data1; int* ptr2 = (int*)data2; return *ptr1 - *ptr2; } // 结构体比较 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; }

使用示例:

// 整型数组求最大值 int nums[] = {3, 5, 8, 7, 6}; int* pMax = (int*)getMax(nums, sizeof(int), sizeof(nums)/sizeof(int), intDataCompare); // 结构体数组求最大值 Dog dogs[] = {{"沙皮",3},{"腊肠",10},{"哈士奇",5}, {"京巴",8},{"大狗",2}}; Dog* pDog = (Dog*)getMax(dogs, sizeof(Dog), sizeof(dogs)/sizeof(Dog), dogDataCompare);

3.2 qsort函数自定义排序

标准库的qsort函数是void指针和函数指针的经典应用:

void qsort(void* base, size_t num, size_t size, int (*comparator)(const void*, const void*));

使用示例:

// 整型数组排序 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);

通过合理设计比较函数,可以实现升序、降序或任何自定义排序规则。

http://www.jsqmd.com/news/552042/

相关文章:

  • STM32F103 Flash模拟EEPROM实现与磨损均衡设计
  • 华为交换机VRRP实战:用eNSP模拟一个部门隔离、主备网关自动切换的企业网
  • Python AI推理卡顿元凶锁定:Cuvil IR图层分析法,3分钟定位动态shape引发的kernel重编译瓶颈
  • 咸宁减肥训练营2026服务商全面评估:从专业封闭营到智能私教 - 2026年企业推荐榜
  • 论文省心了!盘点2026年全网爆红的的降AI率平台
  • Mac上Ganache一键安装与Metamask无缝对接指南(含私钥导入技巧)
  • 突破硬件限制:让旧设备焕发新生的系统升级指南
  • 微软一边卖 Copilot,一边让内部团队实测 Claude Code:这件事真正暴露了什么
  • OpenClaw调试技巧:百川2-13B模型任务执行过程的实时日志分析
  • 从Bode到ADS:用‘策动点阻抗’判据,给你的电路稳定性加一道‘数学保险’
  • 如何在Python中处理大型数据集
  • 2026年优质双股针织纱品牌推荐指南:功能性(抗菌/凉感)色纺纱定制/单股梭织纱/双股针织纱/多组分混纺色纺纱订纺/选择指南 - 优质品牌商家
  • FullCalendar自定义按钮实战:next/prev月份切换回调的优雅实现
  • 2026降AI率工具红黑榜:降AI率工具怎么选?这份榜单够用!
  • 3个步骤掌握Laigter:2D游戏光照效果一键生成的秘密武器
  • 人大金仓V8数据库Windows安装避坑指南:从授权文件到大小写敏感设置全解析
  • SerialTCPClient:嵌入式串口转TCP/SSL桥接库详解
  • 2026护坡网采购指南:直连河北优质工厂,破解工程安全难题 - 2026年企业推荐榜
  • 从“Hello World”到数据监控:用STC8G+printf打造你的简易串口调试助手
  • lt6211与lt6211c的HDMI转LVDS源
  • 告别手动调时间!用STM32F4的RTC闹钟和自动唤醒实现一个智能定时提醒器
  • 安徽市场玻璃钢除臭箱品牌综合评测:2026年第一季度谁主沉浮? - 2026年企业推荐榜
  • Miniconda-Python3.8镜像实测:3步完成Python环境搭建
  • MOOTDX工具实战:3大场景效率提升指南
  • Milvus + Ollama 实战:5分钟搭建本地文本搜索引擎(Java版)
  • STM32F10x Flash模拟EEPROM原理与AN2594实战指南
  • STM32智能安全头盔系统设计与实现
  • seo优化词在网站优化中的地位是什么
  • 突破Windows系统限制:Interceptor驱动级输入模拟技术实战指南
  • 2026年安徽暖气片选购指南:五大高评价服务商深度测评与选型策略 - 2026年企业推荐榜