函数指针是指向函数的指针变量,它是一个指针,同时是指向一个函数。和一个整数指针,结构指针,或对象指针都是同一个道理。
1,基本定义
int Func(int,int);
这是声明一个函数。其中Func是其函数名,以此为调用标识。
int (*fp)(int,int);
这就是定义了一个函数指针,这个指针变量的名是fp,它是一个指针,指向一个函数,这个函数就是带两个INT类型的参数,返回一个int的函数。()的优先级最高,所以(*fp)是个函数,而*fp又标明,fp是个指针,是指向这个函数的指针。
这样就可以直接把上面定义的函数赋于此变量。
fp= Func;
这样在调用时:
(*fp)(1,2)和Func(1,2)是一样的情况,在VC中,fp(1,2)也是同样的效果。
2,typedef声明函数指针类型。
int (*fp)(int,int)定义了一个函数指针,如果有个类型是函数指针类型,以后每次定义变量时和int a一样直观就更好了,typedef就可以实现这样的目的,当然下面还会用到typedef的,还有其它的好处
typedef int (*FP)(int,int);
这就定义了一个类型FP,这个类型,就是函数指针类型,所有这一类型的变量都是指针,指向带两个int类型的参数返回int值的函数。
FP fpa, fpb;定义两个函数指针变量。也就是:
int (*fpa)(int,int); int (*fpb)(int,int);
fpa = Func; fpb = Func;
3,返回函数指针的函数
int (*ffp(int a))(int,int)
{
std::cout << "ffp(int)(int,int) " << a <<std::endl;
return Func;
}
看上面的定义,很显然是一个函数,但是它的定义形式好像有点特别,其实这就是一个带一个int参数和一个返回值的函数,而这个返回值不是其它的类型,是一个函数指针类型,就是返回是一个函数指针。
从里向外看,()优先级高。ffp(int a)是定义函数的形式,再结合*,标明它的返回值是个指针,而这个指针是什么类型呢?就是 int (*)(int,int)这些一个类型,就是函数指针类型。
如果用typedef会更直观一些。
typedef int (*FP)(int,int);
FP ffp(int a)
{
return Func;
}
再进一步,如果希望用指针的方式调用 ffp那怎么办呢?
定义一个指针
FP (*fffp)(int);
fffp = ffp;
fffp(1)(2,3);
或
typedef int (*(*FFFP)(int))(int,int);
FFFP fffp = ffp;
如果不用typedef
int (*(*ffpa)(int))(int,int); //从里向外结合
ffpa = ffp;
ffpa(1)(2,3);
4,函数指针用做函数的参数,同样。
void FwithFP(int a, int (*b)(int,int))
{
b(a,a+1);
}
FwithFP(1,Func); //call
5,成员函数指针
成员函数指针和普通的函数指针是不一样的。
操作符::*定义一个成员函数指针
操作符->*通过对象指针调用
操作符.*通过对象调用
class FunPtr
{
public:
int TestFun(int,int);
int (FunPtr::*memfunp)(int,int);
};
memfunp成员变量是个指针,指针成员函数,此函数带两个int类型的参数,返回int型的返回值。
memfunp = &FunPtr::TestFun;
FunPtr fp;
fp.*memfunp(1,2);
FunPtr* pfp = &fp;
pfp->*memfunp(1,2);