admin管理员组

文章数量:1794759

函数指针的使用方法

函数指针的使用方法

一、函数指针


如果我们在程序中定义了一个函数:

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); }

本文标签: 指针使用方法函数