函数指针

Posted 小菜鸡y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针相关的知识,希望对你有一定的参考价值。

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);

 

以上是关于函数指针的主要内容,如果未能解决你的问题,请参考以下文章

梦开始的地方 —— C语言: 函数指针+函数指针数组+指向函数指针数组的指针

C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

为啥 WSARecvMsg 函数实现为函数指针,这个指针可以重复使用吗?

C++基础3(函数指针结构体)

C++基础3(函数指针结构体)

关于函数指针的注意事项