函数指针实战



25.函数指针的实战。
用函数指针指向不同的函数来实现同一个调用执行不同的结果,类似C++或Java语言等面向对象的语言的多态一样。
下面是一个简单的计算机程序:
/*
#include <stdio.h>


typedef int (*pType)(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);
}


int main(void)
{
pType p1 = NULL;
char c = 0; 
int a = 0, b = 0, result = 0;

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

switch(c)
{
case '+': p1 = add; break;
case '-': p1 = sub; break;
case '*': p1 = mul; break;
case '/': p1 = div; break;
default: p1 = NULL; break;
}


p1(a, b);
printf("%d %c %d = %d.\n", a, c, b, result);


return 0;
}
*/
Linux中命令行默认是行缓冲的,就是说当我们程序printf输出的时候,linux不会一字一字地输出我们的内容,而是将其缓冲起来放在缓冲区,等一行准备玩了再一次性把一行的内容全部输出来(为了效率)。而Linux中判断一行有没有结束的一句就是换行符'\n'.(windows中的换行符是"\r\n",ios中的是'\r')。
我们在使用printf调试的时候后面一定要加上\n,否则可能会产生误判。
26.函数指针实战2.分层思想
一个复杂的程序内容很多,一个人搞不定,需要多人协同工作,于是就要分工。要分工先分层,分层之后各个层次由不同的人完成,然后再彼此调用组合共同工作。
本程序中要完成一个简单的计算器,设计了2个层次:上层是framework.c,实现应用程序框架;下层是cal.c,实现计算器。实际工作是cal.c直接完成工作的,但是cal.c中的关键部分是先调用framework.c中的函数来完成的。
/*
27.
//framework.c需要完成计算器的业务逻辑,并且把相应的接口写在对应的头文件中发出来,将来别的层次的人用这个头文件来协同工作。
/* *******************framework.h ***************** */
#ifndef __CAL_H__
#define __CAL_H__


typedef int (*pFunc)(int , int );


struct calt_t
{
int a;
int b;
pFunc p;
};


int calculator(const struct cal_t *p);
#endif


/* *******************framework.h ***************** */
/* *******************framework.c ***************** */
//上层注重业务逻辑,没有具体的干活函数
#include "framework.h"


int calculaotr(const struct cal_t *p)
{
return (p->p(p->a, p->b));
}
/* *******************framework.c ***************** */
*/


28.cal.c需要完成具体的计算过程的函数
/*
/************************** cal.h *******************/
#ifndef __CAL_H__
#define __CAL_H__


int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);


#endif
/************************** cal.h *******************/


/************************** cal.c *******************/
//下层注重实际干活的函数
#include "cal.h"


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);
}
/************************** cal.c *******************/
*/


29.main.c在主函数中将framework.c和cal.c中的内容整合起来实现我们的功能
/************************** main.c *******************/
//main.c函数中填充结构体变量,然后调用上层提供的接口进行运算函数指针调用下层的具体的计算函数来计算,返回计算结果。
#include <stdio.h>
#include "cal.h"
#include "framework.h"


int main(void)
{
int ret = 0;
struct cal_t myCal;

myCal.a = 54;
myCal.b = 9;
myCal.p = div;

ret = calculator(&myCal);
printf("ret = %d.\n", ret);

return 0;
}
/************************** main.c *******************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值