typedef void (*Fun) (void) ——typedef函数指针

#include <iostream>
 
using namespace std;
//定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数的函数
char (*pFun)(int);
//定义一个返回类型为char,参数为int的函数
//从指针层面上理解该函数,即函数的函数名实际上是一个指针,
//该指针指向函数在内存中的首地址
char glFun(int a)
{
    cout << a;
    //return a;
}
 
int main()
{
//将函数glFun的地址赋值给变量pFun
    pFun = glFun;
//*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。
    (*pFun)(2);
    return 0;
}
typedef char (*PTRFUN)(int); 
PTRFUN pFun; 
char glFun(int a){ return;} 
void main() 
{ 
    pFun = glFun; 
    (*pFun)(2); 
} </span>

函数本身就是一个指针,比如书Void  func(int a)

func 就是一个指针
我们再定义一个指针,去指向这个函数的地址。即为函数指针

比如说

char (*pFun)(int);

这个就是定义了一个char类型的指针pFun,这个指针指向的是一个“函数”,但是我们并不知道这个函数是什么。不过这个函数的参数却已经确定了。

我们以此来实例

  1. typedef char (*PTRFUN)(int);

  2. PTRFUN pFun;定义一个函数指针

  3. char glFun(int a){ return;}定义一个函数

  4. void main()

  5. {

  6. pFun = glFun;将这个函数指针指向这个函数

  7. (*pFun)(2);},(*pFun)就相当于是glFun,不过换了一种写法,穿的也是地址。

最后总结:

1. 便于分层设计:函数指针是引用,是间接层,或曰隔离层。它输出到上层,给上层用户用。函数实体是实现,在下层,给开发者用,实现者(软件工程师)关注。这就是简单的分层的概念了。上层用户想让一个函数所做的东西会变化时,我们只需要改变底层实现,并用函数指针指向新的实现就行了。
再精炼一下分层:分层的核心是对接口进行设计和实现。函数指针的作用就是提供不同实现的统一接口。
2. 利于系统抽象:只有存在多个类似的实体需要模拟、操作或控制时(这种情况很多)才需要抽象。多个类似的实体就是对象,抽象的结果就是类。在C里边,可以用函数指针数组完成这种抽象。如, fopen 就是一个例子。他可以打开文件。C里面将磁盘文件、串口、USB等诸多设备抽象为文件。
3. 降低耦合度以及使接口与实现分开

一个函数指针,只需要改改指向的对象,就可以操作不同的函数,所以最大的好处之一是灵活

此外:指向函数的指针(函数指针),经常被用来当做参数

,就像是类的指针,参数传递一般就是传值和传址两种方式,作为函数的话,好像都想不出怎么传值。 我理解所谓指向函数的指针就是这个函数的入口地址。直接就跳转到那个地址去执行了。

另:处理回调函数

2Windows编程中的事件handle函数,即回调函数,在事件队列都是一个函数指针来保存的:
typedef void (*event_handler) (unsigned int para1, unsigned int para2);
struct event {
  unsigned int ev_id;
  event_handler handler;
};

struct event event_queue[MAX_EVENT_SIZE];
程序可以通过扫描这个事件队列来获取每个事件对应的处理函数,然后调用它,即为回调函数。

猜你喜欢

转载自blog.csdn.net/baidu_39486224/article/details/81349058