文章目录

  • 简介
  • 为什么一定要使用 typedef 定义函数指针呢?

简介

关于函数指针的介绍,点击超链接即可查看,这里就不做过多说明了,或者可以点击这里:
https://blog.csdn.net/CSNN2019/article/details/112492092

关于typedef作用的介绍,点击超链接即可查看,这里就不做过多说明了,或者可以点击这里:
https://blog.csdn.net/CSNN2019/article/details/112495262

接下来呢,我们一起来通过例子来讲解一下typedef 定义函数指针:

#include<iostream>
using namespace std;int Add(int x, int y) {return (x+y);
}typedef int (pointerA)(int a, int b); // 声明一个函数类型
typedef int (* pointerB)(int a, int b);// 声明一个函数指针类型
int (*add)(int a, int b);// 定义一个函数指针变量int main() {pointerA* AddOne = Add;pointerB  AddTwo = Add;add = Add;printf("%d\n", AddOne(1, 3));printf("%d\n", AddTwo(1, 3));printf("%d\n", add(1, 3));
}

pointerA* AddOne = Add;  1
pointerB  AddTwo = Add;  2

解释一下,首先右边Add肯定是表示一个函数的地址,不顾是加不加&,都表示这个函数的地址,左边的变量肯定是代表指向这个函数地址的变量,因此,左边必须要用一个函数指针来接收!!!!

第一行是代表pointerA 是代表一个函数类型,如果不加 * 的话,那么后面的变量它就是一个函数,只不过是个没有函数主体的函数,没有实际意义!!!
第二行是代表pointerB 是代表一个函数指针类型,紧接着的后面变量就是一个函数指针,就回到了函数指针范畴,大家都可以理解。

为什么一定要使用 typedef 定义函数指针呢?

首先,使用 typedef 定义函数指针,代码看起来更简洁,也更不容易出错。

其次,当函数指针作为其它函数的参数,特别是作为返回值时,直接使用的函数指针无法编译。

#include <stdio.h>void FunA() {printf("call FunA\n");
}void FunB(int n) {printf("call FunB. n is : %d\n", n);
}typedef void (*PtrFunA)();
typedef void (*PtrFunB)(int);// 函数指针作为函数参数使用
void usePtrFunA(PtrFunA p) {p();
}void usePtrFunB(PtrFunB p, int n) {p(n);
}//下面这种语法编译器已经无法识别了
//(void (*PtrFunA)()) getPtrFunA2() {//    return FunA;
//}// 函数指针作为函数返回值使用
PtrFunA getPtrFunA() {PtrFunA p = FunA;return p;
}PtrFunB getPtrFunB() {PtrFunB p = FunB;return p;
}int main() {// 获取 FunA 函数的函数指针PtrFunA a = getPtrFunA();// 使用 FunA 函数的函数指针usePtrFunA(a);// 获取 FunB 函数的函数指针PtrFunB b = getPtrFunB();// 使用 FunB 函数的函数指针usePtrFunB(b, 1);return 0;
}

c/c++ typedef定义函数指针(Hook前奏2)相关推荐

  1. typedef 定义函数指针

    原文地址:typedef 定义函数指针作者:兰音 (一)简单的函数指针的应用. //形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){ ...

  2. typedef定义函数指针类型的使用

    定义函数指针 定义函数指针的方法,返回值与参数列表要与指针所要指向的函数一致 返回值 (*函数指针名)(参数列表); 使定义的函数指针ptrFunc指向函数Func,并且使用ptrFunc ptrFu ...

  3. 使用 typedef 定义函数指针,更优雅的使用函数指针

    简介 关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客: https://blog.csdn.net/afei__/article/details/80549202 使用 typ ...

  4. 用typedef定义函数指针类型(转)

    typedef可以用于定义函数指针类型: [语法] typedef <返回类型> (*<函数类型名>)(参数表) typedef <返回类型> (<类名> ...

  5. C语言之typedef定义函数指针(十三)

    一.typedef两种用法 1.定义已有类型的别名typedef 类型 定义名;栗子: typedef char *pChar; pChar s1, s2, s3; 注意:s1.s2.s3都被定义为c ...

  6. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  7. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  8. c/c++中typedef与函数指针

    读linux代码时,常常见到形如 typedef void (*irq_flow_handler_t)(unsigned int irq, struct irq_desc *desc); 的代码. 这 ...

  9. 【C++】宏定义函数指针类型

    1.宏定义不分配内存,变量定义分配内存. 2.宏名和参数的括号间不能有空格 3.宏替换只作替换,不做计算,不做表达式求解 //下面是正确的标准的写法 typedef int(FUNC1)(int in ...

最新文章

  1. 用mpvue实现的微信小程序版cnode社区
  2. Linux之软件卸载 apt-get
  3. mysql5.6.20二进制安装
  4. CCNP精粹系列之三十二--BGP下一跳问题,推荐
  5. access violation reading 0x0000000000000020
  6. 7.SpringMVC 配置式开发-ModelAndView和视图解析器
  7. [考试]20150528
  8. 字节跳动AI副总裁离职,将加入清华大学张亚勤团队
  9. python--类与GUI编程框架
  10. centos5.3安装vmware
  11. 表格列展示自动扩展_进步一点点:excel表格常规操作也能很快捷
  12. 新车可以无牌上路7天_铜竟然可以做成袜子,连穿7天不臭脚!
  13. hadoop深入学习之SequenceFile
  14. 给VS2008安装MSDN
  15. Ubuntu查看硬盘序列号
  16. Linux 基础资料
  17. 第4章_1——SQL语句实现MySQL增删改查
  18. 最新二开微信表情包小程序+前后端 【去授权版】
  19. 基于aspnet+20ajax问卷调查系统的设计和实现_百度文库,基于ASP.NET的网络问卷调查系统的设计与实现...
  20. 【微博简易爬虫】Python获取指定微博用户的发布文本

热门文章

  1. Py之pandas:pandas的read_excel()函数中各参数说明及函数使用方法讲解
  2. AI:2020 科大讯飞AI开发者大赛,总奖金池180+万元!拿下比赛,大厂offer到手,那么,你还在等什么?
  3. Hyperopt官方中文文档导读
  4. python之time模块和hashlib模块
  5. [转帖]最值得了解的10大开源技术
  6. 织梦多个栏目arclist调用副栏目不显示的解决办法
  7. 使用tomcat时,不用给webapps文件放入文件,直接访问项目方法
  8. 常见网络游戏同步方式
  9. 后缀自动机序列自动机综合
  10. Android 开发工具类 36_ getSimSerial