【问题标题】:Calling Function using array of function pointer使用函数指针数组调用函数
【发布时间】:2015-01-31 02:06:43
【问题描述】:

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

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[] 是什么意思。编译器将分配多少字节?

【问题讨论】:

    标签: c


    【解决方案1】:
    1. typedef 用于简化函数指针数组的声明。
    2. 由于funHandlr是typedef-name,所以不能调用。

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

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

    3. const funHandlr arr[] = { ... }; 定义了一个名为 arr 的数组,其推导出长度为 const funHandlrfunHandlr 是上面定义的类型。

    【讨论】:

    • 那么fun1、fun2、fun2将如何执行
    • 我不太明白你的意思,抱歉。你能详细说明一下吗?
    • 我的意思是,如果我想调用 fun1。我怎么打电话。我可以直接调用 fun1()。如果是,那么函数数组的用途是什么
    • @Reshmikhanna 它允许arr[expr]()0<=expr && expr<3
    • 那么函数数组有什么用呢? fun1 可以直接调用
    【解决方案2】:
    1. typedef 使人类更容易“解析”函数指针的定义。它在这里没有其他用途,因为它只使用过一次。
    2. funHandlr 不能被“调用”,因为它是一种类型。 funHandlr 类型的对象(例如任何数组元素)可以像调用函数指针一样被调用。
    3. 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);
    

    如果我们可以直接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 语句会在您希望更改函数签名的情况下产生维护责任。函数指针数组增长到一百多个项目的情况并不少见。为每次调用添加一个新参数需要很多努力。

    然而,对于一组函数指针,只有一次调用改变。此外,您的代码的读者不必滚动数百行即可了解发生了什么。

    【讨论】:

    • 如果是这样的话,那么函数数组和函数指针funHandlr有什么用呢?直接fun1或者fun 2,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2019-01-25
    • 2012-09-15
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多