一、指针函数
1、解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数。如:
int fun(int x,int y); //这是一个普通函数的声明,返回值是一个int类型,是一个数值。
int *fun(in x,int y); //这就是指针函数,返回值是一个int类型的指针,是一个地址。
2、指针函数的写法:
int *fun(in x,int y);
或int * fun(in x,int y);
或int* fun(in x,int y);
二、函数指针
1、解释:指向数据区域的指针,称为数据指针。指向代码区域的指针称为指向函数的指针,简称函数指针。
函数指针,其本质是一个指针变量,只不过该指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型,函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如:
//比较两个string对象的长度
bool lengthCompare(const string &, const string &);
该函数的类型是bool (const string &, const string &)。要想声明一个可以指向该函数的指针,只需要指针替换函数名即可:
bool (*pf) (const string &, const string &); //该指针还未初始化
这句语句的意思是,pf就是一个指向函数的指针,其中该函数的参数是两个const string的引用,返回值是bool类型。
注意:*pf两边的括号必不可少。如果不写这个括号,则pf就是一个返回值为bool指针的函数了,大家可以对比上面的指针函数。
2、函数指针的定义方法:
int (*p)(int , int ); //未初始化
或:int (*p)(int , int ) = q ; //在定义函数指针时初始化,其中q应该与指针p所指向的函数类型相同。
或:int q(int);
int (*p)(int);
p=q;
3、使用函数指针
当我们把函数名作为一个值使用时,该函数自动地转换成指针。例如:按照如下形式我们可以将lengthCompare的地址赋给pf:
pf = lengthCompare; //pf指向名为lengthCompare的函数
pf = &lengthCompare; //同上面等价的赋值语句
此外,我们还可以直接使用函数指针调用该函数(下面三行是等价的):
bool b1 = pf("Hello", "Goodbye");
bool b2 = (*pf)("Hello", "Goodbye");
bool b3 = lengthCompare("Hello", "Goodbye");
注:函数指针本身也是一种数据类型,如:
int (*) (int);
是int (int)型函数的指针类型,其中的“(*)”的括号也是不能省略的。
函数指针的定义形式看起来比较复杂,所以通常采用typedef来简化。例如:
typedef int (*Fun) (int a , int b);
表示声明了一个函数指针类型。注意,此处不是定义函数指针实体。因此:
int m(int , int);
Fun funp = m; //ok
Fun = m; //错