简介

关于函数指针的介绍,这里就不做过多说明了,不了解的同学可以看看这篇博客:

https://blog.csdn.net/afei__/article/details/80549202

使用 typedef 定义函数指针

通过下面这个例子,我们看看 typedef 是怎么搭配函数指针使用的吧。

int add(int a, int b) {return a + b;
}typedef int (PTypeFun1)(int, int); // 声明一个函数类型
typedef int (*PTypeFun2)(int, int); // 声明一个函数指针类型
int (*padd)(int, int); // 传统形式,定义一个函数指针变量int main() {PTypeFun1 *pTypeAdd1 = add;PTypeFun2 pTypeAdd2 = add;padd = add;cout << pTypeAdd1(1, 2) << endl;cout << pTypeAdd2(1, 2) << endl;cout << padd(1, 2) << endl;return 0;
}

以上三种形式都可以正确的使用函数指针,那么使用 typedef 来定义函数指针有什么好处呢?请看下面分析。

我们为什么一定要使用 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;
}

使用 typedef 定义函数指针,更优雅的使用函数指针相关推荐

  1. c/c++ typedef定义函数指针(Hook前奏2)

    文章目录 简介 为什么一定要使用 typedef 定义函数指针呢? 简介 关于函数指针的介绍,点击超链接即可查看,这里就不做过多说明了,或者可以点击这里: https://blog.csdn.net/ ...

  2. typedef 定义函数指针

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

  3. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

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

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

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

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

  6. 定义返回函数指针(地址)的函数

    其实函数指针和普通类型的指针没什么区别,只不过从代码的表现形式上略有差异罢了,回顾一下,下面定义两个在普通不过的"变量",仔细推敲以下他们的区别.(插几句,现在所做的工作虽谈不上是 ...

  7. typedef定义函数类型的用法

    typedef定义函数类型的用法 最近在CodeProject上看了段关于COM in plain C项目的代码,其中的一段关于typedef使用的代码一时让人有点模糊,代码如下: typedef l ...

  8. 带参函数_更好的理解Python第五弹函数预处理与指针

    编译预处理 预处理概念:在编译之前进行处理 在C语言中,预处理行为宏定义,文件包含,条件编译 指令 用处 # 无 #define 定义一个宏 #undef  取消定义一个已经定义的宏 #include ...

  9. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

最新文章

  1. 产品经理一定要懂得“借力”
  2. ios-http协议
  3. 如何花两年时间面试一个人
  4. Updatepanel与Jquery合用时的问题解决
  5. sgi---1 vector
  6. wxWidgets:wxVariantDataSafeArray类用法
  7. git push 代码报错 Pushing to Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
  8. 多场景下MySQL临时表的作用
  9. 怎样设置HTML上传控件,上传文件的大小
  10. C#中执行Dos命令
  11. 解决:启动项目报错 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory...
  12. Quicksort算法之父——1980年图灵奖获得者查尔斯·霍尔
  13. js实现 打开网页自动弹出添加QQ好友邀请窗口、或直接打开聊天窗口
  14. 你可能会读错的字大集合
  15. chrome模拟手机功能
  16. 史上最被低估的神级学科,看完忍不住感慨“它”也太重要了!
  17. 这几点技巧可提高 Kindle 使用体验
  18. 启示录:了解TOD模式的正确打开方式(一)
  19. 视频剪辑教程,教你批量给全部视频添加上下图片水印
  20. XMLHttpRequest API

热门文章

  1. Ubuntu使用总结-持续更新
  2. elasticsearch优化的点点滴滴
  3. Python经典前端框架:Django,第三天【Django基础教学--模型】
  4. 曾几何时的一个项目,回忆,编程真的需要学习
  5. 文件编码识别工具icu4j
  6. 从零学Java(7)之数据类型,小AD竟然solo不过小朋友
  7. windbg符号表路劲设置成功后没有自动下载
  8. 自编程实现朴素贝叶斯算法,Navie Bayes程序(python),并对鸢尾花数据进行分类。
  9. 状态空间方程系统建模
  10. 离子交换树脂回收贵金属铂钯工艺详解