一篇文章了解【函数指针数组】
2024 - 09 - 28 - 笔记 - 19
作者(Author):郑龙浩 / 仟濹(网名)
函数指针数组
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;
}
② 拓:转移表 - 跳转功能(重要)
如上所述,通过选择数组中的下标来访问对应的函数指针,并通过该函数指针调用相应的函数,以实现计算器程序中的跳转功能。这种数组在编程中通常被称为跳转表或转移表,它用于根据输入或状态选择性地执行不同的函数。
原文地址:https://blog.csdn.net/m0_60605989/article/details/142618361
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!