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

三、总结

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

在这里插入图片描述

相关文章
|
2月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
46 3
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
70 4
|
2月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
54 2
|
2月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
43 1
|
3月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
3月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。