非淡泊无以明志,非宁静无以致远
全部博文(408)
分类: C/C++
2016-07-25 17:26:36
用途:
函数指针通常用来实现回调,也可以用来对模块调用以函数表的形式进行优化。
使用方法:
1、定义函数指针类型
使用typedef更直观更方便
// 定义一个原型为int Fun( int a );的函数指针
typedef int (*PTRFUN) ( int aPara );
typedef的功能是定义新的类型。这里定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
2、函数指针变量的定义
PTRFUN pFun; // pFun 为函数指针变量名
int (*pFun2) ( int a ); // pFun2也是函数指针变量名
3、函数指针作为函数的参数传递
// 定义回调函数
int CallBack( int a )
{
return ++a;
}
// 定义回调者函数
void Caller( PTRFUN cb )
// void Caller( int (*cb) ( int ) ) // 也可这样申明
{
int nPara = 1;
int nRet = cb( nPara );
}
// 使用回调
void Test()
{
Caller( CallBack ); // 直接使用回调函数
PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack;
int nRet1 = cb( 99 ); // nRet1 = 100;
}
4、函数指针的指针使用
// 定义函数指针的指针
typedef int (**PTRPTRFUN) ( int aPara );
// 函数指针的指针作为参数
void PtrCaller( PTRPTRFUN cb )
// void PtrCaller( PTRFUN* cb ) // 指针申明
// void PtrCaller( int (**cb) ( int ) ) // 原型申明
{
int nRet = (*cb)(999); // nRet = 1000;
}
// 使用函数指针的指针
void Test()
{
PTRFUN cb = CallBack;
PtrCaller( &cb );
}
5、函数指针数组的使用
// 函数指针数组的定义
PTRFUN fArray[10];
// int (*fArray[10]) ( int ); // 原型定义
for ( int i = 0; i < 10; i++ )
{
fArray[i] = CallBack;
int nRet = fArray[i](i); // nRet = i+1;
}
使用实例:
这里给出一个使用函数指针的简单例子:
//------------------------------------------------------
#include
typedef int (*PTRFUN) ( int aPara , int bPara);
int func1(int Pa, int Pb);
int func2(int Pa, int Pb);
int func3(int Pa, int Pb);
int func4(int Pa, int Pb);
void main()
{
int i = 0;
int j = 0;
PTRFUN pFuncArray[4] = {func1, func2, func3, func4};
PTRFUN pFunc;
for(i = 3; i >= 0; i --)
{
pFunc = pFuncArray[i];
printf("Output is: %d \n", (*pFunc)(i,i));
}
}
int func1(int Pa, int Pb)
{
printf("func1 with input para %d, %d \n", Pa, Pb);
return Pa + Pb;
}
int func2(int Pa, int Pb)
{
printf("func2 with input para %d, %d \n", Pa, Pb);
return Pa - Pb;
}
int func3(int Pa, int Pb)
{
printf("func3 with input para %d, %d \n", Pa, Pb);
return Pa * Pb;
}
int func4(int Pa, int Pb)
{
printf("func4 with input para %d, %d \n", Pa, Pb);
return (Pb == 0)? 0xffff : (Pa / Pb);
}
输出为:
func4 with input para 3, 3
Output is: 1
func3 with input para 2, 2
Output is: 4
func2 with input para 1, 1
Output is: 0
func1 with input para 0, 0
Output is: 0