回调函数的原理及运用

我只是一个虾纸丫 提交于 2019-11-29 08:20:44

第一个问题:什么是回调函数?来看一下百度百科的定义为:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。说的很复杂,我们来用一个生活中的例子来理解回调的意义。在看这个例子之前我们来总结一下回调机制原理。

回调函数是利用函数指针来实现的一种调用机制

回调机制原理:

1.调用者不知道具体事件发生时需要调用的具体函数

2.被调函数不知道何时被调用,只知道需要完成的任务

3.当具体事件发生时,调用者通过函数指针来调用具体函数

回调机制中的调用者和被调函数互不依赖。

 

例子:我们经常在电视剧或者电影中看到如下情节,一位主人公为了完成某个非常难的任务,这个时候一个绝世高人给了他一个锦囊,对他说你在遇到困难的时候打开这个锦囊,这个锦囊里面写的东西会告诉你怎么做。其实这里面就蕴含了回调的机制在里面。为什么呢?就比如我们把主人公去某个地方完成任务比作一个函数(调用者),然后锦囊里面的内容为一个函数(被调用者)。看看满不满足上述的3个条件。1.主人公不知道锦囊里面的内容,2.锦囊不知道什么时候会被主人公拆开,锦囊里面只写着怎么帮助主人公解决困难。3.当主人公遇到困难的时候,主人公通过打开锦囊来解决困难。

 

来看一个C语言程序加深大家对回调函数的理解。

#include <stdio.h>

typedef int(*Weapon)(int);

void fight(Weapon wp,int arg)
{
     printf("Fight Boss!\n");
     int result=0;
     
     result=wp(arg);
     
     printf("Boss Loss=%d\n",result);
}

int knife(int n)
{
    int ret=0;
    int i=0;
    
    for(i=0;i<n;i++)
    {
        printf("knife attack:%d\n",1);
        ret+=1;
    }
    
    return ret;
}

int sword(int n)
{
    int ret=0;
    int i=0;
    
    for(i=0;i<n;i++)
    {
       printf("Sword attack:%d\n",5);
       ret+=5;
    }
    
    return ret;
}

int gun(int n)
{
    int ret=0;
    int i=0;
    
    for(i=0;i<n;i++)
    {
        printf("Gun attack:%d\n",10);
        ret+=10;
    }
    
    return ret;
}

int main()
{
    fight(knife,5);
    fight(sword,5);
    fight(gun,5);
    
    return 0;
}

怎样理解这个例子呢?

1.fight(wp,arg)函数和knife(n),sword(n),gun(n)他们之间互不依赖,只有当在主函数mian()中调用这3句代码的时候fght(knife,5);fight(sword,5);fight(gun,5);他们之间才通过函数指针产生联系。

本文借鉴了狄泰软件学院的思想在里面。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!