本节将记录函数指针,也就是指向函数的指针的大致用法,函数指针用处最多的要数回调函数,当然也有其他的用途。
在编译为二进制文件后,将代码存储在内存中,所以对应的函数也有自己的地址,也就可以使用指针来操作它!!
下面将讲解使用函数指针的具体操作:
首先需要声明一个函数指针---标准原型是:double (*p) (int )。然后就可以赋值了。如下代码
double (*p)(int);
double func(int a);
p=func;
double tmp=(*p)(3);
当然我还见过一种更高明的用法,可以将指针定义为指针数组,保存多个函数指针,然后可以像遍历数组一样来遍历函数,具体代码如下:
//函数指针
typedef BYTE (*pGetAllCardFun)(BYTE const [], BYTE const , BYTE[], BYTE &);
//指针数组
pGetAllCardFun GetAllCardFunArray[4] ;
GetAllCardFunArray[0] = &GetAllBomCard ; //炸弹函数
GetAllCardFunArray[1] = &GetAllLineCard ; //顺子函数
GetAllCardFunArray[2] = &GetAllThreeCard ; //三条函数
GetAllCardFunArray[3] = &GetAllDoubleCard ; //对子函数
for(int i=0;i<4;i++)
{
pGetAllCardFun pTmpGetAllCardFun = GetAllCardFunArray[i];
(*pTmpGetAllCardFun)(cbTmpCardData, cbTmpCardCount, cbGetCardData, cbGetCardCount);
}
其中的typedef非常重要,也是比较难理解的地方,博主至今也没有理解其根本原理,不过其根本原理如下:
//函数指针
BYTE (*pGetAllCardFun[4])(BYTE const [], BYTE const , BYTE[], BYTE &);
//指针数组
pGetAllCardFun[0] = GetAllBomCard ; //炸弹函数
pGetAllCardFun[1] = GetAllLineCard ; //顺子函数
pGetAllCardFun[2] = GetAllThreeCard ; //三条函数
pGetAllCardFun[3] = GetAllDoubleCard ; //对子函数
for(int i=0;i<4;i++)
{
(*pGetAllCardFun[i])(cbTmpCardData, cbTmpCardCount, cbGetCardData, cbGetCardCount);
}
BYTE (*pGetAllCardFun[4])(BYTE const [], BYTE const , BYTE[], BYTE &);
//指针数组
pGetAllCardFun[0] = GetAllBomCard ; //炸弹函数
pGetAllCardFun[1] = GetAllLineCard ; //顺子函数
pGetAllCardFun[2] = GetAllThreeCard ; //三条函数
pGetAllCardFun[3] = GetAllDoubleCard ; //对子函数
for(int i=0;i<4;i++)
{
(*pGetAllCardFun[i])(cbTmpCardData, cbTmpCardCount, cbGetCardData, cbGetCardCount);
}
但是还有一种更绕的方式,比较难理解。这里不再详述,可以看C++primer的7.10.3深入讨论函数指针。