函数指针:
函数指针 的本质是一个指针,该指针的地址指向了一个函数,所以它是指向函数的指针。
int (*test)()
指向的是函数而非对象。和其它指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定。与函数名无关
void show(int a); //想要声明一个可以指向该函数的指针,只需用指针替换函数名即可
void(*print)(int a); //print指向一个函数,该函数由一个int形参,返回值是void类型
1,使用函数指针
当有与指针相同类型的函数时,直接赋值即可:
print = show; //print1指向名为print的函数
print = &show; //等价的赋值语句:取地址符是选的
print = 0; //也可以赋值为零,表示不指向任何函数int a = 0;
print(a); //此时便可直接使用print来代替show
2,重载函数的指针
如果想要指向重载函数,则必须清除的界定应该指向哪个函数
void test(int a);
void test(char a);
void test(double a); //test的重载函数//void(*test1)(unsigned a) = test; 错误,因为test的重载函数中,没有unsigned类型的
void(*test1)(char a) = test; //正确,指向第二个test重载函数
3,函数指针形参
即把函数当作形参传入
- void test(int a,int b,int print(int a)); //第三个函数类型会自动转换为指向函数的指针
- void test(int a,int b,int (*print)(int a)); //显示的将形参定义为指向函数的指针
使用:
- test(a, b, print1); //直接把函数print1当作实参使用,会自动转化为指针
还可使用decltype来简化使用函数指针代码
#include<iostream>
using namespace std;
int compare(int a,int b)
{
return a > b ? a : b;
}
//三种相同的方法
void test(int a, int b, int compare(int, int))
{
cout << a + (compare)(a, b) << endl;
}
void test1(int a, int b,int pf(int,int)) //函数类型,会自动转换成指向函数的指针
{
cout << a + (*pf)(a,b) << endl;
}
void test2(int a, int b, int(*pf)(int, int)) //显示的将形参定义成指向函数的指针
{
cout << a + (*pf)(a, b) << endl;
}
int m1(int, int);
typedef decltype(compare) compare1; //等价的类型:函数类型
int(*m2)(int, int);
typedef decltype(compare) *compare2; //等价的类型:指向函数的指针
void test11(int a, int b, compare1 x) //等价的类型:函数类型
{
cout << a + (*x)(a, b) << endl;
}
void test21(int a, int b, compare2 x) //等价的类型:指向函数的指针
{
cout << a + (*x)(a, b) << endl;
}
int main()
{
int a = 10, b = 20;
test(a, b, compare);
test1(a, b, compare);
test2(a, b, compare);
test11(a, b, compare);
test21(a, b, compare);
system("pause");
return 0;
}
4,返回指向函数的指针
和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。然而我们必须把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理
int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参。
(下面内容是从网上看了好久,感觉相对比较好的回答)
第一个硬刚,就是直接定义,那么需要你对c的声明方式比较熟悉。比如我声明一个函数,这个函数没有参数,返回值是一个函数指针,它指向一个参数为int,返回值为int的函数。可能绕了点,多读几遍就好了,那么格式如下
方法一:
int (*fun())(int);
从里面往外面去理解。最开始fun()说明是一个名叫fun的函数,没有参数。然后最外层是int (*)(int)代表fun函数的返回值。是一个指针,指向一个返回值为int,参数为int的函数。
方法二:
typedef int (*funPointer)(int); //定义一个类型funPointer,它是一个指向函数的指针
funPointer fun(); //定义 返回值为指向函数的指针的函数
int basicFun(int para1)
{
return para1;
}
int (*fun1())(int)
{
return basicFun;
}
typedef int (*funPointer)(int);
funPointer fun2()
{
return basicFun;
}
int main()
{
printf("%d\n", fun1()(100));
printf("%d\n", fun2()(100));
printf("%d\n", (*fun1())(100));
printf("%d\n", (*fun2())(100));
}
链接:c中如何定义一个“返回指向函数的指针的函数”? - 知乎
5,将auto和decltype用于函数指针类型
使用过程需要注意当decltype作用于某个函数时,它返回函数类型而并非指针类型。因此需要显示的加上*以表明我们需要返回指针,而非函数本身。
指针函数
它的本质是一个函数,不过它的返回值是一个指针。其声明的形式如下所示:
int *test(.....)
即返回值是这个函数定义的指针类型