本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
C语言超详细讲解函数指针的运用
talkchan · 282浏览 · 发布于2022-06-23 +关注

函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言进阶教程之函数指针的相关资料,需要的朋友可以参考下

前言

前面我们学习了各种各样的指针类型,有些指针可以说是稀奇百怪,特别是函数指针,有些朋友可能觉得,函数指针有些多余,调用函数为什么要用指针调用,直接调用不好吗?

接下来我们从具体的实例来回答同学们的问题,加深对函数指针的理解。

计算器的例子

接下来我们写一个简单的计算器程序,完成不同的计算功能比如加减乘除:

#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 = 1;
	int ret = 0;
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \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;
}


我们很明显地感觉到,是不是代码实在是有些繁琐,不同的功能之间有着高度的相似性,比如说进去之后都需要对x和y赋值,最后又都需要打印一个返回值,但在当前的框架下似乎又很难进行简化。 

这时,我们就进入了今天的主题,如何使用函数指针来给程序瘦瘦身。

回调函数

我们先来看看使用回调函数修改之后的程序。

首先我们在原来的基础上构造了一个新的函数,函数的形参就是一个函数指针的形式:

//使用回调函数
void  cumulate_numbers(int (*cumulate)(int, int))
{
    int x, y;
    int ret = 0;
    printf("输入操作数:");
    scanf("%d %d", &x, &y);
    ret = cumulate(x, y);
    printf("ret = %d\n", ret);
}


然后我们来看看调用函数方面有什么改变: 

scanf("%d", &input);
        switch (input)
        {
        case 1:
            cumulate_numbers(add);
            break;
        case 2:
            cumulate_numbers(sub);
            break;
        case 3:
            cumulate_numbers(mul);
            break;
        case 4:
            cumulate_numbers(div);
            break;
        case 0:
            printf("退出程序\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);


我们可以清楚地认识到每次实现功能,通过函数指针使一开始的 

printf("输入操作数:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);


转变为只要调用一个函数,一行代码就搞定了。我们这些功能比较简单,功能的数量也不多,使四行代码变成了一行,如果功能复杂一些,功能的数量再多一些,对于代码的简化量还是非常可观的。 

那么接下来能否让我们更进一步呢?

转移表

我们再来看看更加简洁的代码:

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("*************************\n");
        printf("请选择:");
        scanf("%d", &input);
        if ((input <= 4 && input >= 1))
        {
           printf("输入操作数:");
            scanf("%d %d", &x, &y);
            ret = (*p[input])(x, y);
            printf("ret = %d\n", ret);
        }
        else if(input != 0)
            printf("输入有误\n");
    } while (input);


运用了指针数组,这个方法叫做转移表。 


c

相关推荐

PHP实现部分字符隐藏

沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 908浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 970浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 962浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1086浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
大家好,我是一名专注技术开发的技术屌丝,有什么问题可以互相交流,一起学习进步,谢谢。
分类专栏
小鸟云服务器
扫码进入手机网页