跳转至

函数指针

#include <iostream>  
using namespace std;  

int add(int a,int b){return a+b;}  
int sub(int a,int b){return a-b;}  
int mul(int a,int b){return a*b;}  

int cal(int a,int b,int (*f)(int,int)){  
    return f(a,b);  
}  

int main(){  
    typedef int (*FuncPtr)(int,int);  
    FuncPtr funcs[3]={add,sub,mul};  
    int a,b;  
    cin>>a>>b;  
    for(int i=0; i<3; i++){  
        cout<<cal(a,b,funcs[i])<<' ';  
        cout<<funcs[i](a,b)<<' ';  
    }  
}

直接定义函数指针变量用int (*变量名)(形参表)

int max(int a,int b){...}
int min(int a,int b){...}

int main(){
    int (*fp)(int,int);
    fp=max;
    cout<<fp(1,5)<<endl;
    fp=min;
    cout<<fp(1,5)<<endl;
}

函数指针变量实际上是函数入口的地址,所以可以用函数指针作为参数,把一个函数作为参数传进另一个函数,以供调用;另外,函数名就是指向这个函数的指针,所以可以直接传入函数名作为实参

1
2
3
4
5
6
7
int cal(int a,int b,int (*f)(int,int)){
    return f(a,b);
}

int main(){
    cout<<cal(1,5,max);
}

如果想定义类型为函数指针的数组,不能使用int (*fp)(int,int)[5]={...},要用typedef给函数指针起一个别名,之后再定义数组

1
2
3
4
5
6
7
8
typedef int (*FuncPtr)(int,int);
Funcptr fptrs[4]={max,min,add,NULL};

for(int i=0; i<3; i++){
    //以下两句等效
    cout<<fptrs[i](1,5)<<endl;
    cout<<cal(1,5,fptrs[i])<<endl;
}