实例讲解C语言函数指针定义及回调函数应用

一个函数会占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这就和数组名表示数组的首地址概念类似。可以把函数的首地址赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这样的指针就是函数指针,函数指针就是指向函数的指针。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。

1.函数指针的定义

函数指针将C语言的灵活性和强大功能推向了一个新的高度。作为一种指向函数的指针,它不仅能够提高代码的复用性,还能实现回调、模拟面向对象编程以及设计模式等高级特性。

函数指针的定义形式为:

eg:

int (*p)(int, int);

例如:

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

(1)returnType 表示函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。

(2)param list参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

(3)注意( )的优先级高于*,第一个括号不能省略,如果写作 returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为 returnType *。

2. 函数指针的三种定义方式

(1)先定义出函数的类型,再通过类型定义函数指针变量

(2)先定义出函数指针的类型,再通过指针类型定义函数指针变量

(3)重点:直接定义函数指针变量

函数指针和指针函数的区别:

# 指针函数本质是一个函数,其返回值是一个指针:

# 函数指针本质是一个指针,其指向一个函数:

简单点就是:函数名带括号的就是函数指针,否则就是指针函数。

3.函数指针的应用—回调函数

函数指针变量可以作为某个函数的参数来使用,回调函数就是一个通过函数指针调用的函数。

写一个函数A,并把这个函数A的地址赋值给一个函数指针,然后把这个函数指针当作参数赋给另一个函数B,函数B通过函数指针来调用函数A。这个函数A就是回调函数。为什么要使用回调函数,因为使用回调函数能够实现底层代码的解耦。

实例

functionpointMain.c

Method.c

Method.h

运行结果

4.参考内容

[1]菜鸟教程《C函数指针与回调函数》

https://www.runoob.com/cprogramming/c-fun-pointer-callback.html

[2]CSDN作者极客代码的文章《C语言函数指针全面指南:从入门到精通》,文章链接为

https://blog.csdn.net/suifengme/article/details/141174126

[3]C语言中文学习网

[4]CSDN作者woshizuopie的文章《嵌入式C语言基础知识 — 函数指针&回调函数&结构体指针》,文章链接为:https://blog.csdn.net/woshizuopie/article/details/118608507

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

作 者 | 郭志龙

编 辑 | 郭志龙校 对 | 郭志龙

函数指针干货

函数本身就是一个地址,也算指针,函数指针和函数很像。

  • C/C++的思路很简单,函数是指针,函数指针也是指针,二者是可以看成一样的。
    • func()和(*func)()一样。
  • “func;”并不会调用func函数, func()才会调用。
  • C++类静态函数和C语言函数类似,假设类名A,&A::static_func代码函数指针。类成员函数需要指明类对象和类函数指针。
    • 如void func(A *a, void (A::*show)()) { (a->*show)(); }
  • PHP 提供变量函数,和函数指针类似。
  • Fortran/COBOL/ PL/I /Pascal/C/C++/D/C#

不显式支持指针的编程语言,有的利用委托来模拟函数指针。

  • 函数指针声明语句比较长,利用typedef定义或重命名函数指针,可以简化代码。

若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。