引入

其实,作为指向函数的指针变量,它最重要的作用就是把函数的地址,作为参数传递给其他的函数

例子

输入三个数,将其中最大值和最小值的和输出出来。

#include <stdio.h>
int main(){
    int max(int a, int b);
    int min(int i, int j);
    int count (int (*num_max)(int,int),int (*num_min)(int,int),int count_num[]);
    int num[3];
    printf("请输入三个数:\n");
    scanf("%d %d %d",&num[0],&num[1],&num[2]);
    printf("最大值和最小值相加的和为:%d",count (max,min,num));
    return 0;
}

int max(int a, int b){
    return a>b?a:b;
}

int min(int i , int j){
    return i<j?i:j;
}

int count(int (*num_max)(int,int),int (*num_min)(int,int),int count_num[]){
    int max,min;
    max=(*num_max)(count_num[0],(*num_max)(count_num[1],count_num[2]));
    min=(*num_min)(count_num[0],(*num_min)(count_num[1],count_num[2]));
    return max+min;
}

说明

上面我们定义了两个自定义函数:
max 和 min
又定义了一个求和函数
count
该函数有三个参数
前两个是指向函数的指针变量,明白了上面的配置之后
在调用 count 函数的时候,main 传递过来的实参是:
max 和 min 函数的入口地址
count 运行的时候,就可以直接用指针变量调用 max 和 min 这两个函数了。

为什么我们不直接在函数里面调用 max 和 min 函数,非要将他们作为参数来使用呢?这不是更麻烦了嘛?

是的,如果只调用 max 和 min 函数就会显得麻烦了,但是如果有多个函数的话:
求两个最大值的和?
两个最小值的和?
最大值和平均数的和呢?
那么,上面的 count 函数不用做任何调整,在 main 主调的时候,传递过去需要的函数即可。
例如:

count(avg,max,num); //平均数和最大数的和
count(max,max,num); //两个最大数的和
count(avg,min,num); //平均数和最小数的和

这样同一个 count 函数,装入不同的函数参数,就可以实现不同的功能,在调用函数的时候更加的灵活!

例2

我们再举一个例子,输入两个数,根据选择不同,求这两个数和、最大值和最小值。

#include <stdio.h>
int main(){
    int num_a,num_b,order;
    int num_max(int a, int b);
    int num_min(int i, int j);
    int num_count (int x, int y);
    int result (int(*p)(int,int),int k ,int q);
    printf("请输入两个数:\n");
    scanf("%d %d",&num_a,&num_b);
    printf("\n 请问需要进行什么操作?\n 1 求最大值\n 2 求最小值\n 3 求两数之和\n");
    scanf("%d",&order);
    if(order==1){
        printf("%d和%d中最大的是:%d\n",num_a,num_b,result(num_max,num_a,num_b));
    }
    if(order==2){
        printf("%d和%d中最小的是:%d\n",num_a,num_b,result(num_min,num_a,num_b));
    }
    if(order==3){
        printf("%d和%d的和是:%d\n",num_a,num_b,result(num_count,num_a,num_b));
    }
    return 0;
}

int num_max(int a, int b){
    return a>b?a:b;
}

int num_min(int i, int j){
    return i<j?i:j;
}

int num_count(int x, int y){
    return x+y;
}

int result((*p)(int,int),int k,int q){
    return (*p)(k,q);
}

这个例子中,我们根据选择的不同,把不同的函数灌入result函数中,得到不同的结果,这就是将函数指针作为参数灵活使用最好的体现。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。