函数指针

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);
原文地址:https://www.cnblogs.com/mrlsx/p/5554820.html