函数的指针类似于指向变量、对象的指针,代表的也是一块内存地址,但是函数指针的声明和他们是不相同的,比如int (*fun)(int,int),函数指针既有返回值也有参数类型。像这个就是返回的是int,参数也是俩个int类型,fun和*必须用小括号括起来,代表的是函数指针。如果没有小括号的话,int * fun(int,int)这个代表的可就是fun函数了,这个函数的返回值是int *了。有时候函数指针的参数比较多,每次都这么写会很麻烦,所以就使用typedef来定义了,比如typedef int (*fun)(int ,int),这个时候fun代表的就是指向返回值是int,参数也是int类型的函数指针了。下面就通过代码看一下函数指针的具体使用吧。

#include <iostream>

using namespace std;
//fun代表的就是一种函数指针的类型,大家理解成像int *这样的就可以了
typedef int (*fun)(int ,int);
//以下定义的是一个函数类型,不是一个函数指针类型,因为没有*,fun2代表的就是函数
typedef int fun2(int,int);

int function(int a1,int a2);

int main()
{
	//为指向函数的指针赋值
	fun f1 = 0; //为函数指针赋值0,代表f1不指向任何的函数
	fun f2 = function; //函数名代表的就是函数的地址,类似于数组的名字代表数组的地址
	f1 = &function; //这个效果和上边的是相同的
	f1 = f2;

	//使用函数指针调用函数
	cout<<f1(1,2)<<endl;
	cout<<(*f2)(2,3)<<endl; //使不使用解引用都是可以的
	return 0;
}

int function(int a1,int a2)
{
	return a1+a2;
}

//函数的形参是函数指针,以下这三种都是可以的
int function2(int a1,int a2,fun);
int function2(int a1,int a2,int (*)(int, int));
int function2(int a1,int a2,int (int, int));

//函数的返回值是函数指针,以下俩种等效
fun function3(int,int);
//理解的时候可以从里往外理解,function3(int,int)代表的是function3函数有俩个int类型的参数,而返回值是int(*)(int,int)
int(*function3(int ,int))(int,int);

//允许函数的形参是函数
int function2(int,fun2);
//不允许使用返回函数的函数
//fun2 function2();
//函数的返回值可以是函数指针
fun2 * function2();

解析函数指针