C | 函数指针数组妙用

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

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


@TOC


前言

铁汁们都知道,指针对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;
}

三、总结

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

在这里插入图片描述

相关文章
|
15天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
28天前
|
存储 编译器 C语言
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
函数指针&&数组指针&&数组传参的本质&&字符指针(进阶篇)
|
2月前
|
C语言
指针和数组笔试题解析(最详细解析,没有之一)
指针和数组笔试题解析(最详细解析,没有之一)
27 0
|
2月前
|
C语言
指向结构体数组的指针
指向结构体数组的指针
15 2
|
2月前
|
存储 算法 C语言
通过指针引用数组元素
通过指针引用数组元素
21 0
|
2月前
|
C语言 C++
数组元素的指针
数组元素的指针
10 0
|
2月前
|
存储 C++
使用字符指针变量和字符数组的比较
使用字符指针变量和字符数组的比较
14 0
|
15天前
指针指向数组
指针指向数组
17 0
|
16天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1
|
16天前
|
存储 C语言
指针数组作为main函数的形参
指针数组作为main函数的形参
13 0