C语言函数指针小结

                                          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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值