函数指针与函数指针数组

目录

一、函数指针

函数指针变量的使用

二、函数指针数组

计算器的实现

1. 计算器的一般实现

2. 使用函数指针数组实现


一、函数指针

函数指针变量是用来存放函数地址的,通过地址能够调用函数。(即指向函数的指针)

函数地址:函数名、&函数名都表示函数的地址

函数指针类型的解析:

int  ( * )  ( int x, int y)   函数指针变量的类型

函数指针变量的使用

#include<stdio.h>
int add(int x, int y)
{
	return x + y;
}
int main()
{
	int (*p)(int, int) = add;
	printf("%d\n", (*p)(2, 3));
	printf("%d\n", p(2, 3));
	return 0;
}

 

上述代码表明函数指针变量在调用时可省去 * 号


二、函数指针数组

函数的地址存到一个数组中,那这个数组就叫函数指针数组。(即存放函数指针的数组)

格式:

int (*arr[3])();

 说明:

arr先和 [ ] 结合,说明arr是数组,数组内容是 int (*) ( ) 类型的函数指针

计算器的实现

1. 计算器的一般实现

#include<stdio.h>
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 main()
{
	int input = 0;
	int x = 0, y = 0;
	int ret = 0;
	int (*arr[5])() = { 0,add,sub,mul,div };
	do 
	{
		printf("*******************\n");
		printf("****** 0.quit *****\n");
		printf("****** 1.add ******\n");
		printf("****** 2.sub ******\n");
		printf("****** 3.mul ******\n");
		printf("****** 4.div ******\n");
		printf("*******************\n");
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("计算器退出\n");
			break;
		case 1:
			printf("请输入两个操作数:");
			scanf("%d%d", &x, &y);
			ret = add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数:");
			scanf("%d%d", &x, &y);
			ret = sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数:");
			scanf("%d%d", &x, &y);
			ret = mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数:");
			scanf("%d%d", &x, &y);
			ret = div(x, y);
			printf("%d\n", ret);
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);

	return 0;
}

可看出代码非常的冗余,switch语句中有大量的重复代码

2. 使用函数指针数组实现

#include<stdio.h>
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 main()
{
	int input = 0;
	int x = 0, y = 0;
	int ret = 0;
	int (*arr[5])() = { 0,add,sub,mul,div };//函数指针数组存入函数的地址
	do 
	{
		printf("*******************\n");
		printf("****** 0.quit *****\n");
		printf("****** 1.add ******\n");
		printf("****** 2.sub ******\n");
		printf("****** 3.mul ******\n");
		printf("****** 4.div ******\n");
		printf("*******************\n");
		printf("请输入:");
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("\n请输入两个操作数:");
			scanf("%d%d", &x, &y);
			int ret = (*arr[input])(x, y);
			printf("%d\n", ret);
		}
		else if (input == 0)
		{
			printf("结束\n");
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	} while (input);

	return 0;
}

主函数部分就不再有冗余的出现,代码变得简洁。


  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值