【C语言】计算器实现

本节代码高能全程高能呦。适当摸摸鱼,调整自身状态。不要忘记锻炼呀,有钱也得有命花才行呀~给家人打个电话,唠唠家常。


前言

本节主要用到函数指针相关知识,感受函数指针的高效高能。首先是实现计算器,第二是实现比较任意类型数据的冒泡排序。


1. 函数指针

函数也有地址,指向函数的指针就是函数指针

1.1 函数指针格式

函数的地址用函数名或者&函数名表示。函数指针的格式是 函数返回值类型 (*指针名) (参数名)

int test(int  int);
int (*pt)(int, int) = &test;  //pt是指向test函数指针
int(*pta)(int, int) = test   //函数名也能直接表示函数地址

1.2 函数指针调用

以上面实例为例,调用格式为

(*pt)(2,3); 
或者
(pta)(2,3)

pt指针解引用,找到函数,调用函数传参。因为指针pta可以直接替换函数test,所以不加‘ * ’也可以。两种方式都合法。

1.3 实例解读

  1. 观察如下代码,这个代码是在做什么呢?花时间,分解一下呦,提示:从0突破
(* (void (*) () )0) ();

答案:此代码为通过函数指针调用首地址为0的函数。

解析:从0开始,0前面是一个括号(void (*) ()),是一个函数指针,在0前面,意为强制类型转换,将0强制转为函数指针类型。再往前,有一个‘ * ’,对0函数指针解引用,最后面的括号是在传参
2. 观察如下代码,说出代码作用。提示:signal是函数名还是指针名呢?

void (* signal(int, void(*)(int))) (int);
答案:
这是一个函数声明,函数是返回值为void(*)(int)类型,
函数名是signal,参数列表是(int, void(*)(int))
解析:
看signal,并没有和‘ * ’括在一起,由于优先级,
signal先与后面的括号结合,故signal是一个函数。
后面紧跟的(int, void(*)(int))是函数signal的参数列表。
将signal(int, void(*)(int))抠出来,会发现还剩下void(*)(int)
这是一个函数指针,这里作为signal函数的返回值类型,大家要注意这种特殊的写法呀

代码优化
上面的写法很难分析,我们可以使用typedef对类型重命名
例如,将unsigned int 换成unit

typedef  unsigned int  unit;

应用:将上面的void(*)(int)换成pf_t

typedef void(*pf_t)(int) 
void (* signal(int, void(*)(int))) (int);
被替换为
pf_t  signal (int, pf_t);

2.函数指针数组

函数指针数组是一个数组,数组的每一个元素是函数地址。通过函数地址调用函数。通过下面实例说明。

3. 计算器实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
	printf("****************************\n");
	printf("****************************\n");
	printf("***** 1.Add     2.Sub ******\n");
	printf("***** 3.Mul     4.Div ******\n");
	printf("***** 5.Sur     0.Exit *****\n");
	printf("****************************\n");
	printf("****************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int Sur(int x, int y)
{
	return x % y;
}
int main()
{	
	int input;
	int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
	do
	{
		menu();
		printf("请选择操作:>");
		scanf("%d", &input);
		if (input == 0)
			printf("退出");
		else if (input >= 1 && input <= 5)
		{
			int x = 0;
			int y = 0;
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			int ret = parr[input](x, y);
			printf("结果为%d\n", ret);
		}
		else
			printf("输入错误");
	} while (input);
}

解析:

int (*parr[6])(int, int) = { 0,Add,Sub,Mul,Div,Sur };
parr为函数指针数组,,包含6个元素,每一个元素是函数地址。
书写就是在函数指针 int(*) (int,int)的基础上加上数组类型parr[6]
调用函数方法: parr[input](x, y);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值