指针进阶-函数指针-函数指针数组

含义:函数指针,顾名思义是一种指针,是一种指向函数的指针

函数指针能更好的指向目标函数的地址,方便函数的调用,能方便的将函数作为参数传递调用,还能作为转换表

例如:利用函数指针实现简单的函数调用

 

#include <stdio.h>
int getMax(int a,int b)
{
	return a>b?a:b;
}
int getMin(int a,int b)
{
	return a>b?b:a;
}
int AddNum(int a,int b)
{
	return a+b;
}
int dataHandler(int a,int b,int (*pfun)(int,int))
{
	int result=0;
	result =(pfun)(a,b);
	return result;
}
int main()
{
	int a=2;
	int b=3;
	int cmd;
	printf("请输入1(求最大值),2(求最小值),3(求和)\n");
	int (*pfun)(int,int);
	scanf("%d",&cmd);
	switch(cmd)
	{
		case 1: pfun=getMax; break;
		case 2: pfun=getMin;break;
		case 3:pfun=AddNum;break;
	}
	int value = dataHandler(a,b,pfun);
	printf("%d \n",value);
}

 函数指针数组

含义:函数指针数组,顾名思义是一个数组,用来存放函数指针的数组

格式: int (*parr[10])={Add,Sub,...}; 

如:实现简单的计算器程序(加减乘除)

传统的计算器我们会用这种方法,但是这种方法书写效率非常低,代码冗余量非常大

#include <stdio.h>
/*1.传统计算器*/
void menu()
{
	printf("***********请选择计算器功能***********\n");
	printf("***********1.加   2.减     ***********\n");
	printf("***********3.乘   4.除     ***********\n");
	printf("***********   0.退出       ***********\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 main()
{

	int input = 0;
	int x = 0;
	int y = 0;
	do {
		menu();
		printf("请选择菜单>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个数:");
			scanf("%d%d", &x, &y);
			printf("%d\n", Add(x, y));
			break;
		case 2:
			printf("请输入两个数:");
			scanf("%d%d", &x, &y);
			printf("%d\n", Sub(x, y));
			break;
		case 3:
			printf("请输入两个数:");
			scanf("%d%d", &x, &y);
			printf("%d\n", Mul(x, y));
			break;
		case 4:
			printf("请输入两个数:");
			scanf("%d%d", &x, &y);
			printf("%d\n", Div(x, y));
			break;
		case 0:
			printf("退出!\n");
			break;
		default:
			printf("输入错误!");
			break;
		}
	} while (input);
	return 0;
}

 我们可以用函数指针数组来实现,来增加效率

#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; }
void menu()
{
	printf("***********请选择计算器功能***********\n");
	printf("***********1.加   2.减     ***********\n");
	printf("***********3.乘   4.除     ***********\n");
	printf("***********   0.退出       ***********\n");
}

/*使用函数指针数组的计算器*/
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int (*Count[5])(int,int)={0,Add,Sub,Mul,Div};
	do {
		menu();
		printf("请选择菜单>");
		scanf("%d", &input);
		if(input>=1 &&input<=4){
		printf("请输入两个数:");
		scanf("%d%d",&x,&y);
		int ret =Count[input](x,y);
		printf("\t\t%d\n",ret);
		}
		else if(input==0)
		{
			printf("退出!!\n");
		}
		else
		{
			printf("输入错误!!\n");
		}
	} while (input);
	return 0;
}

 还有一种方法就是用回调函数,也就是转换表

什么是回调函数 :

如果你把函数指针,作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就是回调函数的过程

#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; }

void menu()
{
	printf("***********请选择计算器功能***********\n");
	printf("***********1.加   2.减     ***********\n");
	printf("***********3.乘   4.除     ***********\n");
	printf("***********   0.退出       ***********\n");
}
/*使用回调函数的计算器*/
void Recal(int (*p)(int,int)){
	int x = 0;
	int y = 0;
	printf("请输入两个数:");
	scanf("%d%d", &x, &y);
	printf("%d\n", p(x, y));
}
int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择菜单>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Recal(Add);
			break;
		case 2:
			Recal(Sub);
			break;
		case 3:
			Recal(Mul);
			break;
		case 4:
			Recal(Div);
			break;
		case 0:
			printf("退出!\n");
			break;
		default:
			printf("输入错误!");
			break;
		}
	} while (input);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值