C | 函数指针数组妙用

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

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

前言

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

三、总结

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

在这里插入图片描述

相关文章
|
5天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
16 3
|
4天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
10 2
|
12天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
22 1
|
22天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
22天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
22天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
27天前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
16 1
|
30天前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
17 0
|
1月前
|
编译器 C语言
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)
|
3月前
|
搜索推荐 C语言
指针与数组
指针与数组
57 9