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

函数指针数组

什么函数指针数组:❓

数组是一个存放相同类型数据的存储空间📃
指针数组内的元素值表示的是地址🏠
函数指针数组,简单来说,就是数组的每个元素存放的是函数的入口地址(函数的名字

怎么存放函数指针?

1.先明白怎么定义,使用typedef

typedef声明函数指针👉

typedef int (*Test)(int a,int b);//声明函数类型int add(int a,int b){printf("%d\n",a+b);return a+b;
}
int mul(int a,int b){printf("%d\n",a*b);return a*b;
}
Test FUN_list[] = { //定义一个数组,里面全是Test类型的函数指针(函数名,入口地址)add,mul
};

注❕:数组存放相同类型数据,所以内部的元素都要是int (*Test)(int a,int b)的,在调用某一函数时,直接具体到数组没某一元素值即可

怎么使用?

1.第一种:直接找到定义好的函数入口,然后调用即可

typedef int (*Test)(int a,int b);//声明函数类型int add(int a,int b){printf("%d\n",a+b);return a+b;
}
int mul(int a,int b){printf("%d\n",a*b);return a*b;
}
Test FUN_list[] = { //定义一个数组,里面全是Test类型的函数指针(函数名,入口地址)add,mul
int main()
{/*  Write C code in this online editor and run it. */printf("Hello, World! \n");int choice;printf(" input:");scanf("%d",&choice);int para1 = 1;int para2 = 2;FUN_list[choice](para1,para2); //像普通函数的调用方式即可,传入函数参数for(int i = 0;i<2;i++){FUN_list[i](para1,para2);}return 0;
}

在这里插入图片描述

2.第二种:用void*类型的数组存放函数指针,在使用的时候强制转换类型,即可找到函数入口并调用

  void 类型比较特殊,它可以表示所有的类型,但是又不能像其他类型那样声明成实体(void a;❌)。在很多项目中的函数的参数使用void* 类型数组,在void* 数组中,即可以有int型,可以有char型,也可以有结构体,将这些参数放在一个void* 型数组中。
  使用void *二元数组存放提前定义好的函数入口,因为void 可以表示所有的类型,所以在使用时需要 **强制转换为需要使用的类型,无论是变量还是函数。👇 **

#define MAXNUM 3
typedef void (*FUN)(void *para); 
enum{ZEOR = 0,ONE = 1,TOW = 2,THREE = 3
};
void add(void *para){printf("This is add para is %d\n",*(int *)para);return;
}
void mul(void *para){printf("This is mul para is %d\n",*(int *)para);return;
}
void *FUN_List[MAXNUM][2] = {{ZEOR, NULL},{ONE, add},{TOW, mul},
};

在使用的时候,提前定义一个函数指针变量用来存放转换类型的后函数入口,然后再调用函数

int main()
{/*  Write C code in this online editor and run it. */printf("Hello, World! \n");int choice;printf(" input:");scanf("%d",&choice);int para1 = 1;int para2 = 2;for(int i = 0;i<MAXNUM;i++){if(choice == FUN_List[i][0]){ //FUN_List[i][0]的值表示一个地址的值,只是对内部的值做一个比较,并没有具体到使用数据类型,不用做转换//若是int *a = (int *)FUN_List[i][0];这样就要做类型转换了FUN fun = (FUN)FUN_List[i][1];  //将void指针类型强制转换为函数指针类型if(fun){fun((void *)&para1); //调用该函数}  }}return 0;
}

除了使用枚举类型,也可以直接使用字符串:

void *FUN_List[MAXNUM][2] = {{"start", NULL},{"closeLED", add},{"openLED", mul},
};int main()
{/*  Write C code in this online editor and run it. */printf("Hello, World! \n");int choice;printf(" input:");scanf("%d",&choice);int para1 = 1;int para2 = 2;for(int i = 0;i<MAXNUM;i++){/*if(choice == FUN_List[i][0]){FUN fun = (FUN)FUN_List[i][1];if(fun){fun((void *)&para1);}  }*/if(memcmp((char *)FUN_List[i][0],"openLED",sizeof("openLED")) == 0){FUN fun = (FUN)FUN_List[i][1];if(fun){fun((void *)&para1);} }}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring快速学习
  • 基于Python的脑电图(EEG)信号分析(4)
  • 《程序猿入职必会(9) · 用代码生成器快速开发》
  • 【JavaScript】详解数组方法 fill()
  • 【已解决】VSCode连接Linux云服务器,代码写着写着服务器突然挂了是怎么回事?
  • 【爬虫实战】利用代理爬取电商数据
  • 【Python】Django Web 框架
  • STM32Cubemxide使用freertos的消息队列(QUEUE)
  • xss漏洞(五,xss-labs靶场搭建及简单讲解)
  • 03 LVS+Keepalived群集
  • Windows应急响应-排查方式
  • C++ 中基本数据类型所占字节简单说明
  • IsaacLab | Workflow 中 rsl_rl 的 play.py 脚本精读
  • Linux useradd命令
  • pytorch学习笔记6 tensor拼接和拆分
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【comparator, comparable】小总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • css选择器
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js写一个简单的选项卡
  • Kibana配置logstash,报表一体化
  • MySQL数据库运维之数据恢复
  • Python打包系统简单入门
  • rabbitmq延迟消息示例
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端自动化解决方案
  • 如何在GitHub上创建个人博客
  • 数据结构java版之冒泡排序及优化
  • 一天一个设计模式之JS实现——适配器模式
  • puppet连载22:define用法
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # C++之functional库用法整理
  • #define
  • #laravel 通过手动安装依赖PHPExcel#
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $refs 、$nextTic、动态组件、name的使用
  • (1)STL算法之遍历容器
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (1)常见O(n^2)排序算法解析
  • (1)无线电失控保护(二)
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (7)STL算法之交换赋值
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (回溯) LeetCode 40. 组合总和II
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks