C语言超详细讲解函数指针的运用

 更新时间:2022年06月23日 10:47:46   作者:JDSZGLLL  
函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于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语言超详细讲解函数指针的运用的文章就介绍到这了,更多相关C语言函数指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ QT实现文件压缩和解压缩操作

    C++ QT实现文件压缩和解压缩操作

    这篇文章主要为大家详细介绍了C++ QT如何实现压缩文件、文件夹和解压缩的操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-11-11
  • C语言中pthread_exit和pehread_join的使用

    C语言中pthread_exit和pehread_join的使用

    pthread_exit用于强制退出一个线程,pthread_join用于阻塞等待线程退出,获取线程退出状态,本文主要介绍了C语言中pthread_exit和pehread_join函数的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • C语言链表完整操作演示

    C语言链表完整操作演示

    这篇文章主要为大家详细介绍了C语言链表的完整操作演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言strcat函数详解:字符串追加的利器

    C语言strcat函数详解:字符串追加的利器

    strcat函数用于将源字符串追加到目标字符串的末尾,并返回一个指向目标字符串的指针,它可以实现字符串的拼接操作
    2024-08-08
  • C语言入门之浅谈数据类型和变量常量

    C语言入门之浅谈数据类型和变量常量

    这篇文章主要为大家介绍了C语言数据类型和变量常量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 深入uCOS中全局变量的使用详解

    深入uCOS中全局变量的使用详解

    本篇文章是对uCOS中全局变量的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • qt首次连接MYSQL驱动的各种问题图文详解

    qt首次连接MYSQL驱动的各种问题图文详解

    通常来说,我们对数据库的操作更多地在于对数据库表的操作,下面这篇文章主要给大家介绍了关于qt首次连接MYSQL驱动的各种问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • DHCP:解析开发板上动态获取ip的2种实现方法详解

    DHCP:解析开发板上动态获取ip的2种实现方法详解

    本篇文章是对开发板上动态获取ip的2种实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • cmake跨平台构建工具的学习笔记

    cmake跨平台构建工具的学习笔记

    CMake是一个跨平台的安装/编译工具,通过CMake我们可以通过简单的语句来描述所有平台的安装/编译过程,下面这篇文章主要给大家介绍了关于cmake跨平台构建工具的相关资料,需要的朋友可以参考下
    2023-02-02
  • 实例代码讲解c++ 继承特性

    实例代码讲解c++ 继承特性

    这篇文章主要介绍了c++ 继承特性的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论