我在我的应用程序中使用了函数指针。但最近我遇到了一个函数指针,它被称为函数指针数组。我无法理解它是如何工作的。以下是示例
typedef uint8 (*fnHandlr)( uint16 iD, uint32 Process);
const funHandlr arr[] =
{
fun1, fun2, fun3
}
uint8 fun1(uint16 iD, uint32 Process)
{
/*Piece of code*/
}
uint8 fun3(uint16 iD, uint32 Process)
{
/*Piece of code*/
}
uint8 fun3(uint16 iD, uint32 Process)
{
/*Piece of code*/
}
我的问题如下,
答案 0 :(得分:1)
typedef
用于简化函数指针数组的声明。由于funHandlr
是typedef-name,因此无法调用。
也不能调用隐式长度3(arr
)的数组,因为它既不是函数也不是函数指针。
类型funHandlr
的值是一个可调用的函数指针。
const funHandlr arr[] = { ... };
定义了一个名为arr
的数组,其推导长度(来自初始值设定项为3)const funHandlr
,funHandlr
是上面定义的类型。答案 1 :(得分:1)
typedef
使人类更容易“解析”函数指针的定义。它在这里没有任何其他用途,因为它只使用一次。funHandlr
无法“调用”,因为它是一种类型。可以使用调用函数指针的相同方式调用类型为funHandlr
的对象(例如,任何数组元素)。arr
是函数指针数组的名称。当你想调用一个函数时,对它应用一个索引,然后加上括号来进行调用。以下是如何基于其索引调用其中一个函数的示例:
int index;
printf("Which function you wish to call? Enter 0, 1, or 2 >");
scanf("%d", &index);
// Make a call like this:
arr[index](myId, myProc);
如果我们可以直接
fun1
,fun2
或fun3
,那么函数数组的用途是什么?
考虑一下如何在没有函数指针的情况下编写类似于上面的程序。以下是您的代码的外观:
scanf("%d", &index);
switch (index) {
case 0: fun1(myId, myProc); break;
case 1: fun2(myId, myProc); break;
case 2: fun3(myId, myProc); break;
}
除了重复且容易出错之外,switch
这样的语句会在您希望更改功能签名的情况下产生维护责任。函数指针数组增长到超过一百个项目的情况并不少见;为每次调用添加一个新参数需要付出很多努力。
但是,使用一组函数指针,只有一个要更改的调用。此外,代码的读者不必滚动数百行就能理解发生了什么。