函数指针示例

例一:函数指针使用
#include <stdio.h>

int printf_1(int a)
{
    printf("this is printf_1\n");
    printf("a = %d\n",a);
}

int main()
{
    int (*f)(int);    //定义函数指针
    
    f = printf_1;     //函数指针指向printf_1函数,注意这里不执行函数,只是指向函数
    f(2);             //向函数指针传入参数,并执行

}


例二:函数指针作为参数

#include <stdio.h>
#include <stdlib.h>
 
int myAdd(int a,int b)
{
	int c = a + b;
	printf("myAdd:%d\n",c);
	return c;
}
 
int myAdd2(int a, int b)
{
	int c = a + b;
	printf("myAdd2:%d\n", c);
	return c;
}
 
//定义了一个类型
typedef int (*MyTypeFunAdd)(int a, int b);
 
//函数指针做函数参数
int Test(MyTypeFunAdd fun)
{
	int c = fun(5,6);
	return c;
}
 
//另一种写法
int Test2(int (*MyTypeFunAdd2)(int a, int b))
{
	int c = MyTypeFunAdd2(7, 8);
	return c;
}
 
void main()
{
	myAdd(1,2);
 
	MyTypeFunAdd my = myAdd;
	my(9,10);
	//实现了任务的调用和任务的编写分开
	Test(my);
	Test(myAdd);
	Test(myAdd2);
        //就算以后增加myAdd3、myAdd4或更多,整体框架也无需更改,直接添加即可
        //Test函数相当于供应商提供的函数,myAdd相当于调用者提供的函数,所以此处被调用者反过来调            
        //用了调用者的函数,即回调函数
 
	system("pause");
}
例三:用函数指针实现简单计算器

#include <stdio.h>

typedef int (*CLAC)(int,int);    //定义函数指针类型(与要赋值的函数形式一致)

int add(int a, int b)    {    return a+b;    }
int sub(int a, int b)    {    return a-b;    }
int mul(int a, int b)    {    return a*b;    }
int div(int a, int b)    {    return a/b;    }

CALC calc_func(char op)        //根据op类型返回对应函数
{
    switch(op)
    {
        case '+':
            return add;
        case '-':
            return sub;
        case '*':
            return mul;
        case '/':
            return div;
        default:
            return NULL;
    }

    return NULL;
}

int calc(int a, int b, char op)
{
    CLAC fp = calc_func(op);    //fp指向返回的函数,注意这里只是指向返回的函数,并不执行返回的        函数

    if(fp)    return fp(a,b);    //执行fp指向的函数
    else      return -1;
}

int main()
{
    int a,b;

    printf("please input:\n");
    printf("a = ");scanf("%d", &a);
    printf("b = ");scanf("%d", &b);

    printf("****************************");
    printf("a + b = %d\n",calc(a, b, '+'));    
    printf("a - b = %d\n",calc(a, b, '-'));    
    printf("a * b = %d\n",calc(a, b, '*'));    
    printf("a / b = %d\n",calc(a, b, '/'));
    printf("****************************");    

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值