C语言(谭浩强第五版)函数指针复习
怎样定义一个函数指针:指针类型名 (*指针变量名)(函数参数表列)//参数表列中只需给出参数类型即可
/* 8.5.3 (8.22)*/
#include "stdio.h"
void main()
{
int max(int x,int y);//函数申明
int a,b,c;
int (*p)(int,int);/*第一个int表示函数值类型(即返回值),后面两个int表示参数类型,*p括号不可丢失* 先与 p结合,表示指针变量,若丢失,即为*(p( int,int)),优先级*低于(),就成了申明p函数,其返回值为指向整型的指针值*/
p=max;//p指向max,max函数基地址赋给p,调用*p即调用max函数,此时*(p+1)不能使用
printf("please enter a and b.\n");
scanf("%d%d",&a,&b);
c=(*p)(a,b);//必须为(*p),与c=max(a,b)等价
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
int max(int x,int y){
int z;
if(x>y)z=x;
else z=y;
return z;
}
怎样判断函数指针:1首先变量时指针变量,有*,如*p,且有()括起来,2看后面有(),且括号了有参数类型
/*8.5.3(8.23)*/
#include "stdio.h"
void main()
{
int max(int,int);//可以只写函数参数类型,但在子函数中必须写明类型和函数参数名
int min(int x,int y);
int (*p)(int,int);
int a,b,c,n;
printf("Please enter a and b.\n");
scanf("%d%d",&a,&b);
printf("Please choose 1(max)or 2(min).\n");
scanf("%d",&n);
if(n==1){
p=max;
c=(*p)(a,b);
}
else {
p=min;
c=(*p)(a,b);
}
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
int max(int x,int y){
int z;
if(x>y)z=x;
else z=y;
return z;
}
int min(int x,int y){
int z;
if(x<y)z=x;
else z=y;
return z;
}
****重要用途
用指向函数的指针作为函数的参数 //目的:讲函数基地址专递给被调用函数,在被调用函数中使用实参函数
原理如下:
fun函数有两个指针参数x1,x2,f1.f2为两个函数,在调用fun函数时,讲f1,f2函数的入口地址分别传递给x1,x2
f1 f2
↓ ↓
void fun(int (*x1)(int),int(*x2)(int,int)){//定义fun函数,形参为函数指针
int a,b,i=1,j=5;
a=(*x1)(i);
b=(*x2)(i,j);
}
/* 8.5.4(8.24) */
#include "stdio.h"
void main()
{
int fun(int,int,int(*p)(int,int));
int max(int,int);
int min(int,int);
int add(int,int);
int a,b,c,n;
printf("Please enter a and b.\n");
scanf("%d%d",&a,&b);
printf("Please choose 1(max)、2(min) or 3(add).\n");
scanf("%d",&n);
if(n==1)c=fun(a,b,max);
else if(n==2)c=fun(a,b,min);
else if(n==3)c=fun(a,b,add);
else printf("value for n is wrong\n");
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
int max(int x,int y){
int z;
if(x>y)z=x;
else z=y;
return z;
}
int min(int x,int y){
int z;
if(x<y)z=x;
else z=y;
return z;
}
int add(int x,int y){
int z;
z=x+y;
return z;
}
int fun(int x,int y,int (*p)(int,int)){
int z;
z=(*p)(x,y);
return z;
}