通过函数指针实现简易计算器

在开始正文之前,我们先浅浅了解一下函数指针。

int *p=&a    整型指针

char*p=&a  字符指针

int(*p)[10]=&arr 数组指针

可见去掉*p剩下的就是指针所指向的类型

所以类比

(int)(*p)(int ,int)=&Add函数指针,指向的函数两个形参为int类型,返回值为int类型

需要注意的是 &Add和Add都代表 函数地址,和数组有所不同

了解完函数指针,我们再来康康函数指针数组

int arr[10]        整型数组

char arr[10]     字符型数组

int*p[10]          指针数组,存放的类型为int*

所以同样类比,去掉数组名和[ ],剩下的为类型

(int)(*p[4])(int ,int)    函数指针数组

 因此类型相同的函数,可以存放在同一个函数指针数组中,以简化代码,话不多说,直接上代码。

//计算器
#include 
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;
}
void menu()
{
	printf("************************\n");
	printf("********1.Add  2.Sub****\n");
	printf("********3.Mul  4.Div****\n");
	printf("************************\n");
	

}

int main()
{

	int input = 0;
	int x = 0;
	int y = 0;
	int(*p[10])(int, int) = { 0,Add,Sub,Mul,Div };//函数指针数组
	do {
		
		menu();
		printf("请输入数字\n");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入操作数\n");
			scanf("%d %d", &x, &y);
			int ret = p[input](x, y);//通过指针找到函数的地址,传递参数
			printf("%d\n", ret);

		}
		else
			printf("输入错误,请重新输入\n");


	} while (input);
	return 0;

用回调函数的写法

回调函数的写法//把A函数的地址传递给B函数,通过函数指针调用A函数,A函数被称为回调函数
void calc(int(*P)(int, int))
{
	int x = 0;
	int y = 0;
	printf("请输入操作数\n");
	scanf("%d %d", &x, &y);
	int ret=P(x, y);
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	do {
		menu();
		printf("请输入数字\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;

		}
} while (input);
	return 0;
	}

你可能感兴趣的:(c语言)