一、函数指针
如果我们在程序中定义了一个函数:
int Max(int x, int y) //定义Max函数
{
if (x > y)
return x;
else
return y;
}
那么函数名Max
就是调用这个函数的入口地址。就如同定义一个数组,这个数组名就是这个数组的首地址。
既然是地址,就可以使用一个指针来指向它。
对应于int Max(int x, int y)
,我们定义的函数指针如下:
int(*p)(int, int);
- 与函数声明类似,
int(*p)
中的int
代表函数的返回值类型为int
; - 括号内的两个
int
代表参数列表; - 这里的
*
代表声明的是函数指针; - 不可将括号忘掉,否则表示声明的是一个函数,返回值类型为
int*
;
因此定义一个函数指针的格式为:
返回值类型(*指针名)(参数列表类型)
二、简单例子
利用上面定义的函数声明和函数指针,完整的例子如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
int Max(int, int); //函数声明
int(*p)(int, int); //定义一个函数指针
int main(void)
{
int a = 1;
int b = 2;
p = Max;
int c = (*p)(a, b);
return 0;
}
int Max(int x, int y){
if (x > y)
return x;
else
return y;
}
三、真实场景使用
上面例子中的调用方式显的很多余,但通常我们是这样使用的:
#include<iostream>
using namespace std;
int getminormaxarp(int num1, int num2, int(*minormax)(int,int))
{
int res=minormax(num1,num2);
return res;
}
int min(int x,int y)
{
return x<y?x:y;
}
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int age1=3;
int age2=5;
cout<<getminormaxarp(age1,age2,min)<<endl;
cout<<getminormaxarp(age1,age2,max)<<endl;
return 0;
}
四、 表驱动函数指针框架
使用事件号调用函数指针
/* 事件和函数表定义 */
typedef WORD32 (*EventFunEntry)(WORD32 eventId);
typedef struct
{
WORD32 EventId; /* 功能ID */
EventFunEntry ActFun; /* 功能函数 */
} T_ACT_FUN;
T_ACT_FUN g_EvFunList[] =
{
{
EV_INIT, funInit},//#define EV_INIT 0
{
EV_EAT, funEat}, //#define EV_EAT 1
{
EV_CALL, funCall},//#define EV_CALL 2
{
EV_RUN, funRun}, //#define EV_RUN 3
};
VOID eventHandelEntry(WORD32 EventId)
{
/* 需要将数组下标和事件号对应起来并下标保护. 比如设置一个固定偏移或事件号都从0开始 */
g_EvFunList[EventID].ActFun(EventId);
}
今天的文章函数指针的使用方法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/29617.html