文章目录

  • 简介
  • 为什么一定要使用 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. python处在哪个阶段_python 基础复习
  2. 初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情
  3. asterisk源码目录结构
  4. 在JFinal的Controller中接收json数据
  5. mysql的库和表相关操作
  6. matlab 实验6 高层绘图操作,实验06_高层绘图操作(第5章).doc
  7. R 操作矩阵和计算SVD的基本操作记录
  8. [转]RxHttp 一条链发送请求,新一代Http请求神器(一)
  9. [CTSC2008]图腾totem
  10. [css] 用CSS实现一个轮播图
  11. 再生龙u盘复制linux,再生龙制作U盘启动盘教程 | 楚盟博客
  12. [转]ng-grid
  13. 另类的缓存技术(存储数据)
  14. mybatis主键是在insert前生成还是之后生成
  15. delphi 简单的发送字符串消息
  16. 29.FFmpeg+OpenGLES+OpenSLES播放器实现(三.FFmpeg配置和编译脚本)
  17. 详解《云原生架构白皮书》,附下载链接
  18. android 控件颜色随焦点变化实例
  19. android看本地视频播放器下载,Android平台上5款最好的本地视频播放软件
  20. PC版微信,公众号文章图片无法加载,解决方法

热门文章

  1. 成功解决AttributeError: Parent variable ‘<Variable: ID (dtype = numeric)>‘ is not the index of entity En
  2. DL:神经网络算法简介之耗算力的简介、原因、经典模型耗算力计算、GPU使用之详细攻略
  3. 成功解决gensim\utils.py:1209: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warn
  4. DL之ANN/DNN: 人工神经网络ANN/DNN深度神经网络算法的简介、应用、经典案例之详细攻略
  5. 逻辑回归模型详解(Logistic Regression)
  6. pandas 中有关isin()函数的介绍,python中del解释
  7. Spring MVC框架处理Web请求的基本流程
  8. 从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?
  9. [LintCode] Trailing Zeroes 末尾零的个数
  10. VC++编译libpng