Loading

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;
}
posted @ 2022-02-20 08:20  咪啪魔女  阅读(34)  评论(0编辑  收藏  举报