本节将记录函数指针,也就是指向函数的指针的大致用法,函数指针用处最多的要数回调函数,当然也有其他的用途。
在编译为二进制文件后,将代码存储在内存中,所以对应的函数也有自己的地址,也就可以使用指针来操作它!!
下面将讲解使用函数指针的具体操作:
首先需要声明一个函数指针---标准原型是: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);
}
但是还有一种更绕的方式,比较难理解。这里不再详述,可以看C++primer的7.10.3深入讨论函数指针。