简析函数指针和回调函数

简介

函数指针变量:一个数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也以存储在某个函数指针变量中。这样,我就可以通过这个函数指针变量来调用所指向的函数。

定义格式

C语言定义函数指针的格式如下:

例如

int func(int a,int b)
{
    cout << a << '\t' << b << endl;
    return 0;
}

int main(void)
{
    //定义func的函数指针,指针名为fp
    int(*fp)(int,int) = NULL;
    //获取func函数的地址
    fp = func;
    //通过函数指针调用func函数
    fp(10,10);    
    return 0;
}

定义格式

格式一

#type: 函数的返回值类型
#func_ptr:函数指针变量的名字
#param:函数的参数
type(*func_ptr)(param,...) = NULL;
返回值(*函数指针名)(形参列表(只需写出形参类型即可));

示例

int func(int a,int b)
{
    printf("func()\n a \t b\n");
    return 0;
}

int main(void)
{
    //定义func的函数指针,指针名为fp
    int(*fp)(int,int) = NULL;
    //获取func函数的地址
    fp = func;
    //通过函数指针调用func函数
    fp(10,10);    
    return 0;
}

格式二(推荐)

#type: 函数的返回值类型
#func_ptr:函数指针变量的名字
#param:函数的参数
typedef type(FUNC)(param,...);
FUNC *fp = NULL;

格式三

#type: 函数的返回值类型
#func_ptr:函数指针变量的名字
#param:函数的参数
typedef type(*FUNC_P)(param,...);
FUNC_P fp = NULL;

三种格式汇总

#include <stdio.h>

//定义函数指针的三种方法

int func(int a,int b)
{
    printf("func()\n a \t b\n");
    return 0;
}

//方法一(推荐)
typedef int(FUNC)(int,int);

//方法二
typedef int(*FUNC_P)(int,int);

int main(void)
{
    //方法一(推荐)
    FUNC *fp = NULL;
    fp = func;
    fp(10,20);

    //方法二
    FUNC_P fp2 = NULL;
    fp2 = func;
    fp2(100,200);

    //方法三
    int(*fp3)(int,int) = NULL;
    fp3 = func;
    fp3(300,400);
    return 0;
}

回调函数

回调函数(callback)就是一个通过函数指针调用的函数。在C语言中就可以利用函数指针来实现回调函数的功能,下面是回调函数的示例。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义函数指针
typedef void(SKILL)(void);

//武器属性结构
typedef struct {
    //武器名字
    char name[32];
    //武器星级
    char star[32];
    //武器的技能,在函数中实现,并用函数指针调用;此用法相当于c++中的抽象类中的纯虚函数
    SKILL * skill;
}Weapon;

//创建武器对象
Weapon * create_weapon(const char * name,const char * star,SKILL *skill)
{
    Weapon * weapon = (Weapon *)malloc(sizeof(Weapon));
    if(!weapon)
    {
        return NULL;
    }
    strcpy(weapon->name,name);
    strcpy(weapon->star,star);
    //注册回调函数:为回调函数指针赋值
    weapon->skill = skill;
    return weapon;
}

//销毁武器对象
void destroy_weapon(Weapon ** pWeapon)
{
    if(pWeapon)
    {
        free(*pWeapon);
        *pWeapon = NULL;
    }
}

//用于展示武器的函数
void show_weapon(Weapon * pWeapon)
{
    printf("武器名字:%s\n",pWeapon->name);
    printf("星级:%s\n",pWeapon->star);
    printf("技能:\n");
    pWeapon->skill();
    printf("-------------------------\n");
}



//技能1
void skill1()
{
    printf("+80攻击力\n");
    printf("+25%%暴击几率\n");
    printf("唯一被动:暴击造成225%%伤害,而非200%%\n");
}

//技能2
void skill2()
{
    printf("+40%%攻击速度\n");
    printf("+25攻击力\n");
    printf("唯一被动:每次普通攻击后会获得20移动速度,持续2秒。每次击杀单位后,获得60移动速度(与前者不叠加)。这个移动速度加成对远程英雄减半。\n");
}

//技能3
void skill3()
{
    printf("+120法术强度\n");
    printf("唯一被动:法术强度提升40%%\n");
}


int main() {
    //创建武器对象
    Weapon * weapon1 = create_weapon("无尽之刃","★★★★★",skill1);
    Weapon * weapon2 = create_weapon("三项之力","★★★★★★★",skill2);
    Weapon * weapon3 = create_weapon("灭世法师帽","★★★★★★★★",skill3);

    //调用函数显示武器属性
    show_weapon(weapon1);
    show_weapon(weapon2);
    show_weapon(weapon3);

    //销毁武器对象
    destroy_weapon(&weapon1);
    destroy_weapon(&weapon2);
    destroy_weapon(&weapon3);
    return 0;
}
手机上阅读

本文由 giao创作, 采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文地址:《简析函数指针和回调函数》

 最后一次更新于2019-03-15

0 条评论

添加新评论

Markdown is supported.