C语言 ---函数指针数组 以计算器(转移表)(Calculator)为例来讲一讲

文章介绍了C语言中的函数指针数组,从指针、指针数组、数组指针、函数指针的概念出发,逐步解析到函数指针数组的定义和用途,特别是如何通过函数指针数组简化代码,例如在计算器程序中的应用,展示了函数指针数组如何作为函数调用的转移表,提高代码的可维护性。
摘要由CSDN通过智能技术生成

写字作画,首先得有激情。要有情绪,为一人、一事、一朵花、一片色彩感动。有一种意向、一团兴致,勃勃然郁积于胸,势欲喷吐而出。

                                                                                          ——《生活是很好玩的》

今天我们来简单了解一下函数指针数组。

而在讲解函数指针数组我们先来非常简略的复习一下与其有关的一些知识。不想看前面的同学可以直接跳转到 >>>>> 五 函数指针数组

目录

一  指针

二 指针数组

三 数组指针

四 函数指针

五 函数指针数组(重点)


一  指针

什么是指针呢?

1. 指针是内存中一个最小单元的编号,也就是地址

2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个 变量就是指针变量。

而指针也具有类型,指针的类型决定了,对指针解引用的时候有多大的权限(即能操作几个字节)。

二 指针数组

指针数组是指针还是数组? 答案:是数组。是存放指针的数组

例:如图 arr 是一个数组,有三个元素,每个元素是一个整形指针。

 

三 数组指针

数组指针是指针?还是数组? 答案是:指针。即指向数组的指针。

四 函数指针

 函数指针即是指向函数的指针变量。  函数的地址即是其的函数名

答:pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。 

下面贴上两段很有意思的代码供大家思考

//代码1
(*(void (*)())0)();
//代码2
void (*signal(int , void(*)(int)))(int);

五 函数指针数组(重点)

下面我们正式进入正题:

我们知道数组是一个存放相同类型数据的存储空间。那要把函数的地址(函数名)存到一个数组中,那这个数组就叫函数指针数组。

//定义
int (*parr1[10])();
返回值(*数组名[元素个数])(数据类型,数据类型)

在上面的例子中,parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针。

那我们了解了这些,函数指针数组又有什么用呢?

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

下面我们通过用代码实现计算器来举例。

通常我们可以使用下面的方法实现计算器:

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;
}

但我们发现在switch语句中我们重复使用了printf("输入操作数:");和scanf("%d %d", &x, &y);,printf("ret = %d\n", ret);这三个语句,使得整个代码显得很繁琐冗长。

如果我们使用了函数指针数组则会使代码变得更加简洁。

int main()
{
    int x = 0;
    int y = 0;
    int input = 0;
    int ret = 0;
    int (*parr[5])(int, int) = {NULL, add,sub,mul,div };
    do
    {
        printf("**************************\n");
        printf(" 1:add            2:sub \n");
        printf(" 3:mul            4:div \n");
        printf("******   0:QUIT   *******\n");
        printf("**************************\n");
        printf("请选择:");
        scanf("%d", &input);
        if ((input <= 4 && input >= 1))
        {
            printf("请输入要计算的值:");
            scanf("%d %d", &x, &y);
            ret = (*parr[input])(x, y);
            printf("计算得:%d\n", ret);
        }

    } while (input);

    return 0;
}

函数指针数组就是用来存放函数指针的,而函数指针存放的地址就是函数名,函数指针和函数的使用方法上除了名字没有区别,所以既然函数指针存放的是函数名,函数名就是函数地址,我们直接就将函数名(地址)存入数组中。 当我们选择不同功能时,就可以输入数组下标来使用相应的函数。

改变后的代码采用if语句进行输入合法性的判断,而今后不论是添加函数功能,还是删除,只需要修改数组大小,删除(添加)数组元素即可(针不错)。

注 :

 添加一个元素个数和NULL是为了使我们的输入值与相应功能相对应。


好了,有关函数指针数组的知识就讲到这里了,感谢,希望对您有帮助。

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值