6-7 函数指针
使用函数指针
-
声明函数指针:
int (*fp)(int, int);
fp是一个指针,指向一个函数
函数的形参是两个int,返回类型是int
-
函数名作为值使用时,会自动转换为指针类型,取值符是可选的
int f(int, int); fp = f; fp = &f;
-
调用函数指针时,解引用符号是可选的
调用fp指向的函数
int m,n; fp(m,n); (*fp)(m,n);
函数指针作形参
函数不能作为形参,但是函数指针可以,以函数作为形参输入时,会转换为函数指针
//第三个参数是函数,默认转换为函数指针
void Func(int m, int n, int fp(int, int));
//显示声明参数为函数指针
void Func(int m, int n, int (*fp)(int, int));
//调用
Func(m,n,f);
Func(m,n,fp);
简化函数指针的书写
- 别名
- typedef
- using
- 自动类型
- decltype
- auto
typedef int(*)(int,int) FP;
typedef decltype (FP) fp2;
using fp3 = decltype(FP);
函数指针作返回值
f1是这样一个函数,参数是int,返回函数指针,该指针指向一个参数为int*,int,返回值为int的函数
直接声明int (*f1(int))(int, int);
从里到外读此声明,f1后有形参列表,说明f1是一个函数,返回值有*,说明返回类型是一个指针,指针指向函数,函数的参数列表是(int ,int ),返回值是int
等价于
FP f1(int);
decltype(f) *f1(int); //int f(int, int)
练习
编写两个函数,对两个整数进行加减运算,将指向这两个函数的指针存入vector中,并调用
#include<iostream>
#include<vector>
using namespace std;
int add(int m, int n);
int sub(int m, int n);
int main(){
vector<int(*)(int, int)> v;
v.push_back(add);
v.push_back(sub);
for(auto fp : v){
cout<<fp(2,2)<<endl;
}
return 0;
}
int add(int m, int n){
return m+n;
}
int sub(int m, int n){
return m-n;
}