通过转移表练习函数指针的使用

通过了解指针我们直到了一些常规类型的指针
int a=1;  //整形变量
char b='1';  //字符型变量
int *p1=&a;   //指向整形指针
char *p2=&b;  //指向字符型的指针
....
p1是一个指向整形的指针,p2是一个指向字符型的指针,同样我们也接触了一些高级的指针
int **pp=&p1;   //二级指针  pp是指向指针的指针
int (*p3)[10];  //数组指针 p3指向的是大小为10个整形空间的数组
int *p4[10];    //指针数组   p4是个数组 数组的每个元素都是一个整形指针
int (*pfun1)(int,int);  //函数指针   指针pfun1是指向一个接收两个int型参数的返回值为整形的函数
int (*pfun2[10])(int,int); //函数指针的数组  pfun2是一个数组它可以存放10个函数指针的地址
int (*(*q)[10])(int,int);  //指向函数指针数组的指针 q是指向可以存放10个函数指针的数组

这里我们联系使用函数指针的数组来实现一个简单的计算器

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
double add1(double a, double b)    //  +
{
	return a + b;
}
double sub1(double a, double b)    //  -
{
	return a - b;
}
double mul1(double a, double b)    //  *  
{
	return a*b;
}
double div1(double a, double b)    //  /
{
	if (0 == b)
	{
		printf("math error!\n");
		return EXIT_FAILURE;
	}
	else
		return a / b;

}                                //可以加更多的运算
int main()
{
	int choose = 1;		
	double result = 0;
	double num1 = 0;
	double num2 = 0;
	double(*pfun[])(double, double) = { add1, sub1, mul1, div1 };//函数指针的数组
	while (choose)
	{
		system("cls");
		printf("   1.+    2.-  \n");
		printf("   3.*    4./  \n");
		printf("   0.exit      \n");
		printf("choose the function:");
		scanf("%d", &choose);

		if (0 == choose)
		{
			system("pause");
			return 0;
		}
		else
		{
			printf("please enter the nums:");
			scanf("%lf %lf", &num1, &num2);
			result = pfun[choose - 1](num1, num2);   //通过函数指针来调用相应的函数
			printf("%lf\n", result);
			getchar();
			printf("Press any key to continue");
			getchar();
		}
	}
	system("pause");
	return 0;
}
但是我们为什么要这样写呢?

当我第一次拿到这个题目的时候我首先也想到的是使用switch case语句不是很好实现吗?

我们设置case标签来识别运算符号,不是很简单的就能写出代码吗?

但是想一想我们计算器真正能实现的功能远远不止与加减乘除,真正的计算器实现的功能估计也有个上百种,这样的switch case语句是不是看起来非常之庞杂!!

但是下面只一句代码就可以取代所有的switch case语句

result = pfun[choose - 1](num1, num2);   //通过函数指针来调用相应的函数


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值