目录
1、用函数指针变量调用函数
1.1、通过函数名调用函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int max(int,int);
int a,b,c;
printf("请输入a和b:");
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
system("pause");
return 0;
}
int max(int x,int y)
{
return(x>y?x:y);
}
本程序摘录自谭浩强的c语言设计,注意输入a和b的值的时候中间的逗号要用英文输入。
1.2、通过指针变量调用它所指向的函数
#include <stdio.h>
#include <stdlib.h>
int main()
{
int max(int,int); //函数声明
int(*p)(int,int); //定义指向函数的指针变量p
/*最前面的int表示这个函数值(即函数返回的值)是整型的、最后面的括号中有两个int,
表示这个函数有两个int 型参数*/
int a,b,c;
p=max; //使p指向max函数
/*在给函数指针变量赋值时,只需给出函数名而不必给出参数,因为是将函数入口地址赋给p,而不牵涉实参和形参的结合问题。*/
printf("请输入a和b:");
scanf("%d %d",&a,&b);
c=(*p)(a,b); //通过指针变量调用max函数
/*用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p之后的括号中根据需要写上实参)。c=(*p)(a,b);表示“调用由p指向的函数,实参为a,b。得到的函数值赋给c。”*/
printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
system("pause");
return 0;
}
int max(int x,int y)
{
return(x>y?x:y);
}
怎样判定指针变量是指向函数的指针变量呢,第一看变量名前面有没有*号,第二看变量名的后面有无圆括号,内有形参的类型。注意,由于优先级的关系,*指针变量名要用圆括号 括起来。
2、定义和使用指向函数的指针变量
通过函数名调用函数,只能调用所指定的一个函数,而通过指针变量所调用函数比较灵活,可以根据不同情况先后调用不同的函数。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int max(int,int);
int min(int,int);
int(*p)(int,int); //定义指向函数的指针变量p
int a,b,c,n;
printf("请输入a和b:");
scanf("%d,%d",&a,&b);
printf("请输入模式1或2");
scanf("%d",&n);
if(n==1)
p=max;
else if(n==2)
p=min;
c=(*p)(a,b);
printf("a=%d\nb=%d\n",a,b);
if(n==1)
printf("max=%d\n",c);
else
printf("min=%d\n",c);
system("pause");
return 0;
}
int max(int x,int y)
{
return(x>y?x:y);
}
int min(int x,int y)
{
return(x<y?x:y);
}
运行结果:
3、用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其他函数
指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能够在被调用的函数中使用实参函数。
有一个函数,假设函数名为fun,它有两个形参x1和x2,定义x1和x2为指向函数的指针变量。在调用函数fun时,实参为两个函数名f1和f2,给形参传递的是函数f1和f2的入口地址。这样在函数fun中就可以调用f1和f2函数了。
void fun(int(*x1)(int),int(*x2)(int,int)) //定义fun函数,形参是指向函数的指针变量
{
int a,b,i=3,j=5;
a=(*x1)(i); //调用f1函数,i是实参
b=(*x2)(i,j); //调用f2函数,i,j是实参
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int fun(int x,int y,int(*p)(int,int));
int max(int,int);
int min(int,int);
int add(int,int);
int a,b,n;
printf("请输入a和b的值:\n");
scanf("%d,%d",&a,&b);
printf("请输入模式1,2或者3:\n");
scanf("%d",&n);
if(n==1)
fun(a,b,max);
else if(n==2)
fun(a,b,min);
else if(n==3)
fun(a,b,add);
system("pause");
return 0;
}
int fun(int x,int y,int(*p)(int,int))
{
int result;
result=(*p)(x,y);
printf("%d\n",result);
return(result);
}
int max(int x,int y)
{
printf("最大值=");
return(x>y?x:y);
}
int min(int x,int y)
{
printf("最小值=");
return(x<y?x:y);
}
int add(int x,int y)
{
printf("a+b=");
return(x+y);
}