函数指针
1.函数指针的使用
int fun(int a,int b); //声明一个函数 int (*p)(int,int) //定义函数指针,p是一个函数指针,最前面的int是所指函数的返回值类型,后面括号里是该函数的参数类型 //给函数指针赋值 p=fun; //p指向名为fun的函数 p=&fun; //和p=fun等价 //函数调用的几种等价形式 int a=p(1,2); int b=(*p)(1,2); int c=fun(1,2);
2.函数指针定义的几种形式
定义指向int fun(int a,int b)的函数指针
1)直接定义:
int (*p)(int,int);
p=fun; //或p=&fun
2)使用typedef定义类型别名:
//p1,p2是函数指针类型
typedef int (*p1)(int,int);
typedef decltype(fun) *p2;
p1 f1=fun; //这里p1是函数指针类型别名,需要定义具体函数指针对象f,f是指向函数的指针
p2 f2=fun; //同上
//这里p1,p2是函数类型,
typedef int p1(int,int);
typedef decltype(fun) p2;
p1 *f1=fun; //f1是函数指针
p2 *f2=fun; //f2是函数指针
3)使用using定义类型别名
using p1=int (*)(int,int); //p1是函数指针类型
using p2=int(int,int); //p2是函数类型
p1 f1=fun; //f1是函数指针
p2 *f2=fun; //f2是函数指针
3.函数指针形参
1)函数名做形参,函数名会自动转换成函数指针
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } void fun(int(*p)(int,int)) { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //sum自动转换成函数指针 return 1; }
2)定义函数类型别名
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } typedef int f(int, int); void fun(f p) //f是函数类型,做形参自动转换成函数指针类型 { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //这里sum转换成函数指针 return 1; }
3)定义函数指针别名
#include <iostream> using namespace std; int sum(int a,int b) { return a+b; } typedef int(*f)(int, int); void fun(f p) //f是函数指针类型,p是函数指针 { cout << p(2, 3) << endl; } int main(int argc,char *argv[]) { fun(sum); //sum自动转换成函数指针 return 1; }
4.返回指向函数的指针
1)直接定义
int (*f(int))(int,int) //f(int) 是函数名和形参列表,返回值类型是int(*)(int,int)
2)采用尾置返回方式
auto f(int)->int(*)(int,int)
3)使用类型别名定义函数指针类型
tpyedef int(*p1) (int,int); using p2=int(*)(int,int); typedef int p3(int,int); using p4=int(int,int); //等价声明 p1 f(int); p2 f(int); p3 *f(int); p4 *f(int);