简介
函数指针变量:一个数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也以存储在某个函数指针变量中。这样,我就可以通过这个函数指针变量来调用所指向的函数。
定义格式
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 条评论