函数指针

一、函数指针

1. 函数类型:由它的返回类型和形参类型共同决定(与函数名无关)

2. 示例:

int fun1(int a, int b)
{
	return a + b;
}

该函数的函数类型为:int (int, int)

3. 声明一个指向函数的指针:int (*pf)(int, int);

4. 函数名:作为一个值来使用时,该函数自动转换成指针

5. 为函数指针赋值:pf = fun1 或 pf = &fun1    //&是可选的,pf指向名为fun1的函数

6. 为函数指针赋值nullptr:表示该指针没有指向任何一个函数

二、函数指针作为形参

1. 形参若是函数类型,会自动转换成指向函数的指针

2. 对应的实参是函数,函数会被自动转换成指向该函数的指针

3. 示例:

void print(int (*pf)(int, int)); 
void print(int pf(int, int)); 	//形参为函数类型,自动转换成函数指针

4. 简化(类型别名):

//Func是函数类型 
typedef int Func(int, int);	
typedef decltype(fun1) Func; 
//pFunc是函数指针
typedef int(*pFunc)(int, int);
typedef decltype(fun1) *pFunc; 

5. 解读:decltype返回函数类型,此时不会将函数类型自动转换为指针类型,故上面的pFunc前才会加上“*”

6. 简化示例:

void print(pFunc); 
void print(Func); 	//形参为函数类型,自动转换成函数指针 

 

三、返回类型为函数指针

1. 类型别名法

using pf = int (*)(int, int);	//pf是函数指针 
using f = int(int, int);	//f是函数类型 
pf func(parameter_list);
f *func(parameter_list);

2. 直接法

int (*func(parameter_list))(int, int);

3. 尾置返回类型

auto func(parameter_list) -> int (*)(int, int);

4. 使用decltype

前提:知道返回的函数是哪一个

int fun1(int a, int b);
int fun2(int a, int b);
//func返回指向fun1或者fun2的指针 
decltype(fun1) *func(parameter_list);

重申:将decltype作用于某个函数时,它返回函数类型而非指针类型。

补充:具体返回指向f1的指针还是返回指向f2的指针,根据func函数体内的返回值而定。类似的例子——传说门

原文地址:https://www.cnblogs.com/xzxl/p/7665816.html