函数指针就是指向函数的指针,和其他指针一样,函数指针也有类型
函数指针的类型由函数的返回值和函数的形参共同决定,与函数名无关,因为只是个名字
比如,函数的声明如下:
int funcpointer(double d, string str);
那么函数的类型就是int(double, string),所以函数指针就是int (*pf)(double, string)
函数指针的读法依然是先中间,然后两边,
先看到pf和*,知道这是个指针,看到右侧的(double, string),知道这是形参列表,从而了解该指针指向了一个函数,最后看左边int,知道指向的函数返回值是int
pf两边的括号必不可少,如果没有,那么pf就是函数名,返回一个int型指针
函数指针的初始化和赋值
可以直接用函数名给函数指针赋值或初始化,或者在函数名前面加上取地址符号
void testfuncp()
{
int(*pf)(double, string)=funcpointer;
int(*pf2)(double,string);
pf2=funcpointer;
pf(3.14, "asd");
*pf2(2.2,"qwe");
}
int funcpointer(double d, string str)
{
cout<<__func__<<endl;
}
以上代码还显示,可以通过函数指针直接调用函数,而不用解引用,当然,用了解引用符也没什么
当给一个函数指针赋值或者初始化时,函数类型必须匹配,否则报错
void testfuncperror()
{
int(*pf)(double, string)=testfuncp;
}
void testfuncp()
{
int(*pf)(double, string)=funcpointer;
int(*pf2)(double,string);
pf2=funcpointer;
pf(3.14, "asd");
pf2(2.2,"qwe");
}
函数指针的作为形参
函数指针作为形参时,传入的函数会被当做指针处理
int main(int argc, char const *argv[])
{
testfuncpointerpara(twointfunc);
return 0;
}
void testfuncpointerpara(void (*pf)(int, int))
{
cout<<__func__<<endl;
pf(10,20);
}
void twointfunc(int a, int b)
{
cout<<__func__<<endl;
}
返回函数指针
返回函数指针的函数可以按照如下方式进行声明
int (*returnfuncpointer(int a, int b))(int c, int d);
读法依然是先中间,再右,最后左
看中间*returnfuncpointer(int a, int b),知道returnfuncpointer是一个函数,返回的是指针,再看右边有形参列表,知道返回的是函数指针,最后看左边int,知道这个函数指针的指向的函数的返回值是int
int main(int argc, char const *argv[])
{
int a=10,b=20;
int (*pf)(int, int)=returnfuncpointer(a,b);
pf(a,b);
return 0;
}
int (*returnfuncpointer(int a, int b))(int c, int d)
{
cout<<__func__<<endl;
return func;
}
int func(int a, int b)
{
cout<<a+b<<endl;
return a+b;
}
上述代码中的函数returnfuncpointer返回一个类型为int (*)(int a, int b)的函数指针,首先用该函数的返回值初始化pf,然后通过pf调用函数func
参考:
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出