服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言超详细讲解函数指针的运用

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

2023-02-08 14:53JDSZGLLL C/C++

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

前言

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

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

计算器的例子

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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赋值,最后又都需要打印一个返回值,但在当前的框架下似乎又很难进行简化。

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

回调函数

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

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

?
1
2
3
4
5
6
7
8
9
10
//使用回调函数
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);
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);

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

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

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

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

转移表

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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语言函数指针内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/JDSZGLLL/article/details/125271852

延伸 · 阅读

精彩推荐
  • C/C++C语言 图文并茂详解程序编译过程

    C语言 图文并茂详解程序编译过程

    C语言是一种编译型语言,需要把源文件进行编译之后才能运行,它的编译过程是:预处理:展开头文件、宏替换,去掉注释,条件编译;编译:检查语法,...

    清风自在 流水潺潺4572022-11-11
  • C/C++C++ 中回调函数详解及简单实例

    C++ 中回调函数详解及简单实例

    这篇文章主要介绍了C++ 中回调函数详解及简单实例的相关资料,需要的朋友可以参考下...

    stephen_yin3612021-05-17
  • C/C++C语言中的奇技淫巧

    C语言中的奇技淫巧

    学习C语言的过程中,总会遇到很多令人眼前一亮的代码,尤其是你写了几十行的代码,别人只用了简单几行的递归就实现的功能。下面我就总结几个C语言...

    C语言教程网11672021-06-30
  • C/C++C++实现LeetCode(136.单独的数字)

    C++实现LeetCode(136.单独的数字)

    这篇文章主要介绍了C++实现LeetCode(136.单独的数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang5572021-11-30
  • C/C++C++学生信息管理系统

    C++学生信息管理系统

    这篇文章主要为大家想详细介绍了C++学生信息管理系统的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    东X哥7542021-04-06
  • C/C++c++基础语法:构造函数与析构函数

    c++基础语法:构造函数与析构函数

    构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构...

    C++教程网7062021-01-01
  • C/C++C++读入XML文件示例

    C++读入XML文件示例

    本篇文章主要介绍了C++读入XML文件,读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,感兴趣的小伙伴们可以参考一下。...

    新科程序猿5112021-04-21
  • C/C++zlib库压缩和解压字符串STL string的实例详解

    zlib库压缩和解压字符串STL string的实例详解

    这篇文章主要介绍了zlib库压缩和解压字符串STL string的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下...

    infoworld4842021-06-08