C | 函数指针数组妙用

举报
CGod 发表于 2022/10/14 16:39:32 2022/10/14
【摘要】 铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


你好,我是CGod,每个人都可以5分钟编程。
欢迎来到我的主页:《CGod的后花园》


前言

铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景


一、函数指针数组是什么?

  • 顾名思义,xxxxxx数组,所以函数指针数组就是一种数组,数组里的元素都是函数指针罢了。
    在这里插入图片描述
  • 是怎样识别出上述是一个函数指针数组呢?很简单,首先变量p是和[10]结合的,说明它是个数组,然后把这个整体拿开,剩下的部分就是这个数组的类型,这个类型就是函数指针void(*)(int,int)
    在这里插入图片描述

二、函数指针数组应用场景

2.1 具体问题

咱们都接触过,写扫雷、三子棋、通讯录等时,都会用上以下switch代码实现菜单的选择

//通讯录主函数部分
int main()
{
    int input = 0;
    struct Contact con;
    InitContact(&con);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
            case 1:
                AddContact(&con);
                break;
            case 2:
                DelContact(&con);               
                break;
            case 3:
                SearchContact(&con);
                break;
            case 4:
                ModifyContact(&con);
                break;
            case 5:
                ShowContact(&con);
                break;
            case 6:
                SortContact(&con);
                break;
            case 7:
                DestoryContact(&con); 
                break;
            case 0:
                printf("退出通讯录!\n");
                break;
            default:
                printf("选择错误!请重新输入\n");
                break;            
        }  
    }while(input);

    return 0;
}
  • 但是会发现,使用的函数越多,switch的分支就越多,这样的代码太过繁琐。于是我们就可以用函数指针数组进行优化

2.2 使用函数指针数组优化

  1. 我们的目的是把上述代码的函数统一集中管理,那么我们就需要收集它们的地址,于是想到用一个个函数指针存起这些地址,而这一个个函数指针就可以统一放进一个数组里存起来,这个数组就是对应的函数指针数组
  2. 首先我们要知道,函数指针数组里面存放的函数指针,都是同一个类型的,比如void(*p[10])(int,int)数组里面都是void(*)(int,int)指针,这个要特别注意
  3. 刚好,上述代码中需要统一管理的函数都是同个类型void p(struct Contact*)(具体问题具体分析,这边不赘述整体代码了),参数部分是结构体指针,返回值是void。那么需要把这种函数的地址存起来,就需要void(*p)(struct Contact*)的函数指针。然后,要把这种类型的指针存起来,就需要void(*p[])(struct Contact*)的函数指针数组
  4. 于是定义一个这样的函数指针数组并赋值(这边顺便把退出通讯录也封装了一个函数)
void (*Menu[8])(struct Contact*)={ExitContact,
    						      AddContact,
    							  DelContact,
    							  SearchContact,
    							  ModifyContact,
    							  ShowContact,
    							  SortContact,
    							  DestoryContact};
  1. 使用的时候,就通过输入的input当做该数组的下标进行索引,此时再带上实参就行啦
Menu[input](&con);
  1. 下面附上优化后的代码
//通讯录主函数部分
int main()
{   
    int input=0;
    struct Contact con;
    InitContact(&con);
    void (*Menu[8])(struct Contact*)={ExitContact,
    								  AddContact,
    								  DelContact,
    								  SearchContact,
    								  ModifyContact,
    								  ShowContact,
    								  SortContact,
    								  DestoryContact};
    while(1)
    {
        menu();
        printf("请输入:>");
        scanf("%d",&input);
        if(input>=0 && input<=7)
            Menu[input](&con);
        else
            printf("输入非法,请重新输入!\n");
    }
    
    return 0;
}

三、总结

  • 优化之后代码整洁直观了许多,主要思想就是统一打包。相信函数指针数组还有很多应用场景,快去试试叭~

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。