函数指针

一. 函数指针的概念

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

函数指针的定义方式可以如下表示:

函数返回值类型 (* 指针变量名) (函数参数列表);int(*p)(int, int);那么这个指针 p 就可以指向形如:int add(int a, int b);int get_info(int board, int module);
这样类型的指针,形如:p = add;p = get_info;

我们进行对函数指针进行初始化的时候可以做如下操作:

  1. 首先定义一个指针变量。

  2. 将同类型的函数名赋值给它。

/* 定义函数 */
int add(int a, int b)
{return a + b;
}int main()
{// 方法一, 先定义再赋值int (*p1)(int, int);p1 = add;DH_INFO("%d\n", p1(3, 7));// 方法二, 同时定义赋值int (*p2)(int, int) = add;DH_INFO("%d\n", p2(3, 7));
}

使用typedef定义函数指针

在工程上,为了提高开发效率和代码可读性的问题,通常会用typedef对函数指针进行转定义

typdef 函数返回值类型 (*指针类型名) (函数参数列表);typedef uint32_t (*xxx_callback)(int cb_type);此时,通过typedef转定义的为指针类型名,相当于数据结构,(从面相对象的角度来看可以称为类)
可以用于新建(实例化一系列函数指针变量),形如:xxx_callback init_callback;xxx_callback move_callback;而此时根据实际不同业务模块处理的不同,可以将实例化的函数指针变量赋值为不同模块的函数。定义 uint32_t service_init_cb(int cb_type) { return 0; }赋值 init_callback = service_init_cb;使用 ret = init_callback(0);/* 实际代码 */
typedef uint32_t (*xxx_callback)(int cb_type);uint32_t service_init_cb(int cb_type)
{ return cb_type;
}int main()
{/* 实例化函数指针 */xxx_callback init_callback;service_init_cb(3);init_callback = service_init_cb;init_callback(5);
}

函数指针作为函数入参

在工程上,函数指针作为入参,通常用于函数回调。

int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int get_result(int a, int b, int (*math_cal)(int, int))
{return math_cal(a, b);
}int main()
{int res1, res2;res1 = get_result(3, 2, add);res2 = get_result(3, 2, sub);printf("add_res = %d, sub_res = %d\n", res1, res2);
}

存放函数指针的数组

函数返回值类型 (* 指针变量名[数组长度]) (函数参数列表);int (*math_cal[2])(int, int);
math_cal[0] = add;
math_cal[1] = sub;
for (int i = 0; i < 2; i++) {printf("Math cal %d res = %d\n", i, math_cal[i](3, 2));
}动态申请( 还没有研究,求指导)使用typedef的模式: 定义函数指针数据类,利用该数据类常规实例化一个函数数组。
typedef uint32_t (*xxx_callback)();
xxx_callback g_cb_list[10];
int g_len;
uint32_t xxx_callback_register(xxx_callback callback)
{if(!callback) {printf("call back not exist");return -1;}g_cb_list[g_len++] = callback;return 0;
}

函数指针史上最全的介绍相关推荐

  1. algorithm头文件函数全集——史上最全,最贴心

    2022.4.8更: 随着本篇博客观看次数越来越多,假如有一点点疏忽,就可能造成更大的影响, 因此采取动态维护的策略: 从今天开始,每天我会检查评论区, 及时解答大家的疑问,修改可能存在的问题 如果哪 ...

  2. 史上最全Fragment介绍,包括fragment的定义,生命周期,用法

    一.为什么要使用Fragment 1.当我们需要动态的多界面切换的时候,就需要将UI元素和Activity融合成一个模块.在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界 ...

  3. WMS系统是什么——史上最全WMS介绍

    一.什么是WMS? WMS是仓库管理系统(Warehouse Management System) 的缩写.仓储管理系统利用物联网.大数据等技术为多货多仓的企业实现智能化库房管理.系统化仓储管理.透明 ...

  4. 【hive 日期函数 大全】Hive常用日期函数整理 史上最全

    [hive 日期函数 大全]Hive常用日期函数整理注意:1) hive 没有 to_char函数 2) HIVE 日期函数只识别 年-月-日 不能识别 年-月 ,所以处理月份的时候需要特殊处理1)h ...

  5. python bool 转vc int_史上最全的 Python 3 类型转换指南

    史上最全的 Python 3 类型转换指南-1.jpg (13.76 KB, 下载次数: 0) 2018-8-21 17:35 上传 int 支持转换为 int 类型的,仅有 float.str.by ...

  6. Java Math类方法介绍之史上最全

    Java Math类方法介绍之史上最全 开发中用到了Java Math类的方法,故温习记录如下. /*** 常量*/System.out.println("------>" ...

  7. (13)UVM 史上最全TLM单向/双向/多向通信介绍

    UVM 史上最全TLM单向/双向/多向通信介绍 文章目录 UVM 史上最全TLM单向/双向/多向通信介绍 一.TLM单向通信 1.概述 2.类型 3.方法 4.单向通信例子 二.TLM双向通信 1.概 ...

  8. 呕心沥血集齐史上最全 JavaScript最实用工具函数大全,建议收藏!

    为元素添加on方法 Element.prototype.on = Element.prototype.addEventListener; NodeList.prototype.on = functio ...

  9. 史上最全的数学建模竞赛介绍,大家不要错过哦!!!

    史上最全的数学建模竞赛介绍 什么是数学建模竞赛? 数学建模,就是根据实际问题来建立数学模型,并对数学模型来进行求解,然后根据结果去解决实际问题. 数学建模竞赛的基本要求: 不超过三人的队伍(大佬一个人 ...

最新文章

  1. 你熟知的那个杀毒软件公司McAfee,用这种方法骗过护照人脸识别系统
  2. PHP----------PHP自身的性能优化注意事项
  3. mysql jdbc无法连接_jdbc无法连接mysql
  4. 150个Java面试问答-最终清单(PDF下载)
  5. excel 时间戳_我没有Excel基础,可以学Power BI吗
  6. 索引导航-第三版-pyhui
  7. 60 秒 Linux 检查清单,快速初步定位你的性能问题
  8. edge chrome Android,微软Edge浏览器正式登陆Android平台
  9. php错误日志框架,错误与日志 - Laravel - 为 WEB 艺术家创造的 PHP 框架。
  10. 部署shop++,启动eclipse遇到内存溢出。
  11. conda安装与入门
  12. Transcad转Ptv Visum的学习之路
  13. 保持简单----纪念丹尼斯•里奇(Dennis Ritchie)
  14. 计算机无法安装hp网络打印机,hp打印机驱动安装失败怎么办 hp打印机驱动安装失败的解决办法...
  15. 微信公众号如何插入html,教你如何在微信公众号优雅的展示代码
  16. iOS 唤起APP之Universal Link(通用链接)
  17. 寻迹小车代码_活动 | 代码日记—计算机编程培训(泰达校区)
  18. python基础教程菜鸟教程-Python从基础到入门系列教程
  19. Tornado框架06-模板
  20. okhttp3源码初探

热门文章

  1. Spring Cloud Alibaba 新一代微服务解决方案
  2. 支付宝双11狂欢幕后的女程序员:服务全球12亿人,每天和不法分子打攻防战
  3. 支付宝的商业与技术创新双轮驱动 创造数字时代普惠金融“奇迹”
  4. 使用 MaxCompute(原ODPS) java sdk 运行安全相关命令
  5. 2017,人工智能技术如何让中国开发者“倾心”又“上火”!
  6. 年薪15W的程序员因为掌握这个技能,薪资翻倍!
  7. 聊聊困扰很多同学的一个问题:是否要转方向 ?
  8. 漫画:五分钟看懂车联网
  9. lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告
  10. python识别手写文字_如何快速使用Python神经网络识别手写字符?(文末福利)