一篇文章了解【函数指针数组】

函数指针数组

1) 大致了解

【函数指针数组】是一种数据结构**。

函数指针数组是一个由函数指针构成的数组,每个指针指向一个具有“相同”返回类型参数列表的函数,可通过它灵活调用不同的函数。

注:一个【函数指针数组】中存储的函数的地址都必须满足两个条件:

  • 函数【返回类型】相同;
  • 【参数】也相同的。

2) 函数指针数组 的简单示范

该数组中每一个元素都是一个函数指针。

int Add(int x, int y)
{
    return x + y;
}
int Sub(int x, int y)
{
    return x - y;
}
int Mul(int x, int y)
{
    return x * y;
}
int Div(int x, int y)
{
    return x / y;
}
int main()
{
	
	int (*pppp)(int, int) = Add;//pppp是函数指针,像这种是只能存一个函数地址
	int (*pppp2[4])(int, int) = { Add, Sub, Mul, Div };//pppp2 就是函数指针数组名字,Add等就是该函数指针数组中的元素。这样就可以存多个了。
    for( i = 0; i < 4; i ++ )
    {
        int num = arr[i](8, 4);
        printf( "%d\n", num );
    }
	return 0;
}

打印结果:

12
4
32
2

3) 函数指针数组 究竟有什么用???

① 计算机程序的使用

**【函数指针数组】**可以简化一些复杂的程序,减少程序的冗余度。

比如:有一个计算器程序,原本可能通过冗长的switch语句来选择执行加、减、乘、除等计算操作,每个case中分别调用对应的函数。
如果只有加减乘除还好,如果再扩展一些其他功能,需要支持更多的运算符,就要有更多的函数,case越来越多switch 语句会直接膨胀,不紧代码冗长,而且后期进行修改的时候也非常的不方便,并且看起来也不是那么美观那怎么办呢???

重要的地方来了!!!下面是解决方案!!!

我们可以采用**【函数指针数组】来替代这一串case语句**。将所有的功能函数或者计算函数的地址存储在【函数指针数组】中,这样用户就可以通过对应数组下标,来获取要用的函数指针,并利用函数指针进行计算操作。

这种方式不仅代码更加简洁,而且易于扩展,因为如果有新的函数添加,无需再增加case,而是直接在该数组中增加一个函数指针(该数组的元素)即可。

下面将计算器程序写下来,方便理解:

#include <stdio.h>
int Add(int x, int y)//加法
{
    return x + y;
}
int Sub(int x, int y)//减法
{
    return x - y;
}
int Mul(int x, int y)//乘法
{
    return x * y;
}
int Div(int x, int y)//除法
{
    return x / y;
}
void menu()//菜单
{
    printf( "0. 加法(Add)\n1. 减法(Sub)\n" );
    printf( "2. 乘法(Mul)\n3. 除法(Div)\n" );
    printf( "4. 退出\n" );
}

int main()
{
	int (*ppp[4])(int, int) = {Add, Sub, Mul, Div};
    int num1, num2, n, ret;
    while(1)
    {

        printf( "请选择进行什么计算:\n");
        menu();//打印菜单
        scanf( "%d", &n );
        if( n == 4 )
            return 0;//直接退出main函数
        else if( n >= 0 && n <= 3 )
        {
            printf( "请输入两个计算的数值:\n" );
            scanf("%d%d", &num1, &num2);//输入计算数值
            ret = ppp[ n ]( num1, num2 );//存入函数计算结果

            printf( "结果为:%d\n", ret );
        }
        else 
            printf( "输入错误\n" );

    }

    return 0;
}
② 拓:转移表 - 跳转功能(重要)

如上所述,通过选择数组中的下标来访问对应的函数指针,并通过该函数指针调用相应的函数,以实现计算器程序中的跳转功能。这种数组在编程中通常被称为跳转表转移表,它用于根据输入或状态选择性地执行不同的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值