使用函数指针数组调用函数

时间:2015-01-31 02:06:43

标签: c

我在我的应用程序中使用了函数指针。但最近我遇到了一个函数指针,它被称为函数指针数组。我无法理解它是如何工作的。以下是示例

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*/
}

我的问题如下,

  1. 这里有什么类型的typedef。
  2. 如果调用funHandlr,是否会调用数组中的所有函数?
  3. 什么是arr []意思。编译器将分配多少字节?

2 个答案:

答案 0 :(得分:1)

  1. typedef用于简化函数指针数组的声明。
  2. 由于funHandlr是typedef-name,因此无法调用。

    也不能调用隐式长度3(arr)的数组,因为它既不是函数也不是函数指针。

    类型funHandlr 的值是一个可调用的函数指针。

  3. const funHandlr arr[] = { ... };定义了一个名为arr的数组,其推导长度(来自初始值设定项为3)const funHandlrfunHandlr是上面定义的类型。

答案 1 :(得分:1)

  1. typedef使人类更容易“解析”函数指针的定义。它在这里没有任何其他用途,因为它只使用一次。
  2. funHandlr无法“调用”,因为它是一种类型。可以使用调用函数指针的相同方式调用类型为funHandlr的对象(例如,任何数组元素)。
  3. arr是函数指针数组的名称。当你想调用一个函数时,对它应用一个索引,然后加上括号来进行调用。
  4. 以下是如何基于其索引调用其中一个函数的示例:

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

    如果我们可以直接fun1fun2fun3,那么函数数组的用途是什么?

    考虑一下如何在没有函数指针的情况下编写类似于上面的程序。以下是您的代码的外观:

    scanf("%d", &index);
    switch (index) {
    case 0: fun1(myId, myProc); break;
    case 1: fun2(myId, myProc); break;
    case 2: fun3(myId, myProc); break;
    }
    

    除了重复且容易出错之外,switch这样的语句会在您希望更改功能签名的情况下产生维护责任。函数指针数组增长到超过一百个项目的情况并不少见;为每次调用添加一个新参数需要付出很多努力。

    但是,使用一组函数指针,只有一个要更改的调用。此外,代码的读者不必滚动数百行就能理解发生了什么。