前言:
此篇是针对 用指向函数的指针作函数参数 方面的练习。
正文:
#include<stdio.h>
int main() {
int fun(int x,int y,int(*p)(int,int)); //fun函数声明
int max(int x,int y); //max函数声明
int min(int x,int y); //min函数声明
int add(int x,int y); //add函数声明
int a=34,b=-21,n;
printf("please choose 1,2or3:");
scanf("%d",&n); //输入1,2或3之一
if(n==1) fun(a,b,max); //输入1时调用max函数
else if(n==2) fun(a,b,min); //输入2时调用min函数
else if(n==3) fun(a,b,add); //输入3时调用add函数
return 0;
}
int fun(int x,int y,int(*p)(int,int)) { //定义fun函数
int result;
result=(*p)(x,y);
printf("%d\n",result); //输出结果
}
int max(int x,int y) { //定义max函数
int z;
if(x>y)z=x;
else z=y;
printf("max=");
return (z); //返回值是两数中的大者
}
int min(int x,int y) { //定义min函数
int z;
if(x<y)z=x;
else z=y;
printf("min=");
return (z); //返回值是两数中的小者
}
int add(int x,int y) { //定义add函数
int z;
z=x+y;
printf("sum=");
return (z); //返回值是两数中之和
}
程序分析:
在定义 fun 函数时,在函数首部用 “int( * p)(int,int)” 声明形参 p 是指向函数的指针,该函数时整型函数,有两个整型形参。max,min和add 是已定义的3个函数,分别用来实现求大数,求小数和求和的功能。
当输入1时(n=1),调用 fun 函数,除了将 a 和 b 作为实参,将两个整数传给 fun 函数的形参 x 和 y 外,还将函数名 max 作为实参将其入口地址传送给 fun 函数中的形参 p ,见图8.33(a)。这时,fun 函数中的 ( * p)(x,y) 相当于max(x,y),调用max(x,y)就输出 a 和 b 中大者。
若输入2(n=2),调用 fun 函数时,以函数名 min 作实参,此时 fun 函数的形参 p 指向函数 min,见图8.33(b),在 fun 函数中的函数调用 ( * p)(x,y) 相当于 min(x,y)。调用 min(x,y)就输出 a 和 b 中小者。同理,若 n=3,调用 fun 函数时,以函数名 add 作实参,fun 函数中的 ( * p)(x,y) 相当于add(x,y),调用 add(x,y),就输出 a 和 b 之和。情况 见图8.33(c)。
总结:
运行结果:
①
选择1,调用max函数
②
选择2,调用min函数
③
选择3,调用add函数