C语言中的指针-用指向函数的指针作为函数参数-学习笔记-37

引入

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

例子

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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 主调的时候,传递过去需要的函数即可。
例如:

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

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

例2

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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函数中,得到不同的结果,这就是将函数指针作为参数灵活使用最好的体现。

尾巴

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


-------------The End-------------
欢迎请我喝咖啡哦~!