C语言函数指针数组实现计算器功能

 更新时间:2022年04月12日 10:47:44   作者:scut-ALong  
这篇文章主要通过C语言函数指针数组实现了计算器的功能,是一个很好而且流程详细的小例子,感兴趣的新手朋友们可以自己动手也写一遍

一、概念        

数组:一个存放相同类型数据的存储空间。

int arr[10];
//数组arr的每个元素是int

指针数组:一个存放指针的数组。

int* arr[10];
//数组arr的每个元素是int*

函数指针:一个指向函数的指针,一般用函数名表示。

int Add(int x, int y)
{
    return x + y;
}
 
int main()
{
    int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int (*p)[10] = &arr; 
    //取出数组的地址,p就是指向数组arr的指针,数组中每个元素类型是int,p就是数组指针
    
    //引出函数指针的问题
    int (*pf)(int, int) = &Add;
    //是一个指向函数的指针 - 存放函数的地址

需要注意的是,函数名是函数的地址,&函数名还是函数的地址,在visual stdio编译环境下能打印出同一地址。这里的函数指针pf是指向函数Add,其中(int, int)表示函数需要的两个形参类型是int,函数返回值类型是int。        

函数指针数组:一个存放指针的数组,其中的指针都指向各自的函数。

//函数指针
int (*p)(int, int) = Add;
int (*p)(int, int) = Sub; 
//Add和Sub是函数名,需要传入的两个形参和返回值类型都是int
 
//将上面两个同类型的函数指针放入数组中,得到函数指针数组
int (* arr[2]) (int, int) = {Add, Sub};

二、用途

函数指针数组的用途:转移表

三、案例:计算器      

(1)基础代码编译:

#include <stdio.h>
//实现加减乘除
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int sub(int a, int b)
{
    return a * b;
}
int sub(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;
} 

这里用到的switch循环语句,实现了数据的输入、输出和函数调用,结构与功能简单易懂,但主函数中代码太过冗长,重复的代码很多,这样的结构导致后期拓展函数功能需改动的地方非常多。

(2)使用函数指针数组的实现:

#include <stdio.h>
//实现加减乘除
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int sub(int a, int b)
{
    return a * b;
}
int sub(int a, int b)
{
    return a / b;
}
int main()
{
    int x, y;
    int input = 1;
    int ret = 0;
    int (*p[5])(int x, int y) = { 0, add, sub, mul, div };//转移表
    while (input)
    {    
        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);
        }
        else
        {
            printf( "输入有误\n" );
            printf( "ret = %d\n", ret );
        }
        return 0;
}
       

敲重点!!!     敲重点!!!  敲重点!!!

这里我们看到函数指针数组的用法是:数组内容(函数指针)解引用得到函数地址,接着传入参数,进行函数调用,结果返回一个整形(int)数据由ret接收。

ret = (*p[input])(x, y);

在代码中若出现许多函数同返回值类型,同参数类型时,使用函数指针数组是一个能大大简化代码,消除重复代码,是结构更加轻易易懂,为后期拓展更多功能函数提供便利。

到此这篇关于C语言函数指针数组实现计算器功能的文章就介绍到这了,更多相关C语言 计算器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++动态规划之最长公子序列实例

    C++动态规划之最长公子序列实例

    这篇文章主要介绍了C++动态规划之最长公子序列,实例分析了C++求最长公子序列的相关技巧,是C++字符串操作的一个典型应用,需要的朋友可以参考下
    2015-04-04
  • C++通过ofstream和ifstream实现文件读写

    C++通过ofstream和ifstream实现文件读写

    本文详细介绍了C++中通过ofstream和ifstream进行文件的读写操作,包括文件打开模式的选择、错误处理策略以及二进制文件的特殊处理,重点讲解了如何使用这些类进行文本和二进制文件的读写,并强调了正确处理文件操作中可能出现的错误,需要的朋友可以参考下
    2025-03-03
  • 利用C语言实现n字棋游戏

    利用C语言实现n字棋游戏

    本文将利用C语言编写一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-05-05
  • C语言中 & 和 &&的区别详解

    C语言中 & 和 &&的区别详解

    这篇文章主要介绍了C语言中 & 和 &&的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C语言实现linux网卡检测改进版

    C语言实现linux网卡检测改进版

    这篇文章主要为大家详细介绍了C语言实现linux网卡检测的改进版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 浅析c++ 宏 #val 在unicode下的使用

    浅析c++ 宏 #val 在unicode下的使用

    以下是对c++中宏#val在unicode下的使用方法进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • 图文详解c/c++中的多级指针与多维数组

    图文详解c/c++中的多级指针与多维数组

    多维数组与多级指针是初学者经常感觉迷糊的一个地方。超过二维的数组和超过二级的指针其实并不多用。但只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单。
    2016-08-08
  • C++实现LeetCode(189.旋转数组)

    C++实现LeetCode(189.旋转数组)

    这篇文章主要介绍了C++实现LeetCode(189.旋转数组),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++11各种锁的具体使用

    C++11各种锁的具体使用

    本文主要介绍了C++11各种锁的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++中防止头文件重复包含的几种方法

    C++中防止头文件重复包含的几种方法

    在 C/C++ 编程中,当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 include 多次,或者头文件嵌套包含,这些会导致一系列的问题,如符号重定义、编译错误等,因此,防止头文件的重复包含是至关重要的,本文给大家介绍了C++中防止头文件重复包含的两种方法
    2024-05-05

最新评论