指针(三):函数指针

函数指针

函数的地址

函数指针,也就是存放函数地址的变量,有人会问,函数也会有地址吗?我们用一个代码来验证一下吧。

#include <stdio.h>
void test()
{
 printf("hehe\n");
}
int main()
{
 printf("test: %p\n", test);
 printf("&test: %p\n", &test);
 return 0;
}

在这里插入图片描述

我们用&符号对函数取地址并以地址的形式打印,结果如图,很显然函数的确拥有自己的地址,并且函数名就是函数的地址。

函数指针结构

type (*p)(int,int);
 type:表示函数返回类型
(*p):表示p变量是一个指针
(int,int):表示函数的参数是俩个整型   

利用指针来调用函数:

#include <stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int(*pf3)(int, int) = Add;

	printf("%d\n", (*pf3)(2, 3));
	printf("%d\n", pf3(3, 5));
	return 0;
}

在这里插入图片描述

函数指针数组

了解函数指针数组

函数指针数组就是将函数的地址放在一个数组里面,通过访问数组的元素来访问函数,达到简洁代码的效果。

函数指针数组结构

int (*p[5])(int,int);
 type:表示函数返回类型
(*p[5]):表示p变量是一个指针数组,有5个元素
(int,int):表示函数的参数是俩个整型  

简易计算器

为了方便观看,就不用多文件来封装代码了。

#include<stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 0;
	int ret = 0;
	do
	{
		printf("*************************\n");//菜单
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);//选择计算模式
		switch (input)//对输入的数字进行模式选择
		{
		case 1:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}
	return 0;
}

可以看出来很简单的一个功能我们写了很长一段代码,接下来试着用函数指针数组的形式来优化。

函数指针数组优化计算器

#include<stdio.h>

int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x = 0;
	int	y=0;
	int input = 0;
	int ret = 0;
	int (*p[5])(int, int) = {0,add,sub,mul,div};
	do
	{
		printf("*************************\n");//菜单
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);//选择计算模式
		if (input >= 1 && input <= 4)
		{
			printf("输入操作数:");
			scanf("%d %d", &x, &y);
			ret = (* p[input])(x, y);
			printf("%d\n",ret);
		}
		else if (input == 0)
		{
			printf("exit\n");
			break;
		}
		else
		{
			printf("输入错误,重新输入!");
		}
	} while (input);
	return 0;

return 0;
}

在这里插入图片描述
-------------------------分隔符
关于函数指针有关的内容就基本介绍完了,感谢观看。
有错请指正,共勉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值