bool(*pf)(const string &, const string &);//定义了一个指向(函数类型由其返回类型以及形参表决定)函数的指针。
//int app;int是整型类型;
//typedef int kk;
//cmpFcn是一个指向函数的指针类型的名称,指针的类型(指向一个返回bool类型并带有两个const string 引用形参的函数)
typedef bool(*cmpFcn)(const string&, const string &);
bool lengthCompare(const string &, const string &);//除了左操作数的使用,其他的被解释为指针
cmpFcn pf1 = 0;//
cmpFcn pf2 = lengthCompare;//直接引用函数名等于在函数名上取地址
cmpFcn pf1 = lengthCompare;
cmpFcn pf2 = &lengthCompare;
pf1 = lengthCompare;
pf2 = pf1;
//函数指针只能通过同类型的函数或函数指针或0值常量表达式进行赋值。
//函数指针初始化为0,表示该指针不指向任何函数。
//指向不同函数类型的指针之间不存在转换。
//指向函数的指针可用于调用它所指向的函数。可以不需要解引用操作符,直接调用函数。但指向函数的
//指针必须初始化,且不能为0值;
//指向函数的指针可以作为函数的形参。
void useBigger(const string &, const string &, bool(const string &, const string &));
void useBigger(const string &, const string &, bool(*)(const string &, const string &));
//返回值为指向函数的指针
int(*ff(int))(int*, int);//将ff声明为一个函数,它带有一个int型的形参。该函数返回一个指向函数(这个函数
//返回int型并带有两个分别是int*型和int型的形参)的指针,
typedef bool(*cmpFcn)(const string&, const string &);
typedef int(*PF)(int*, int);//pf是一个函数指针
PF ff(int);//函数ff返回一个指向函数的指针
cmpFcn pf1;//这只是定义了一个指向函数的指针。
//允许将形参定义为函数类型,但是函数的返回类型必须是指向函数的指针,而不能是函数
//具有函数类型的形参所对应的实参将被自动转换为指向相应函数类型的指针,但是,当返回的是函数时,同样的转换操作则无法实现
typedef int func(int*, int);//定义了一个函数类型。
int func2(int*, int);
void f1(func);
func f2(int);//error
func *f3(int);
//允许指向函数的指针指向重载函数,但是重载函数的返回类型以及形参必须一致。
extern void ff(vector);
extern void ff(unsigned int);
// which function does pf1 refer to?
void (*pf1)(unsigned int) = &ff; // ff(unsigned)