Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用函数指针数组调用函数_C - Fatal编程技术网

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

C 使用函数指针数组调用函数,c,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,

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

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*/
}
我的问题如下:

  • typedef在这里有什么用途
  • 如果调用funHandlr,是否会调用数组中的所有函数
  • 什么是arr[]意思。编译器将分配多少字节
  • typedef
    用于简化函数指针数组的声明
  • 由于
    funHandlr
    是一个typedef名称,因此无法调用它

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

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

  • const funHandlr arr[]={…}
    定义一个名为
    arr
    的数组,其推导长度(3,来自初始值设定项)为
    const funHandlr
    funHandlr
    为上述定义的类型
  • 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
    这样的语句在您希望更改函数签名的情况下会产生维护责任。函数指针数组增长到超过一百个项的情况并不少见;为每个调用添加一个新参数将需要大量的工作


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

    那么fun1、fun2、fun2将如何执行我不太明白您的意思,抱歉。你能详细说明一下吗?我是说,如果我想给fun1打电话的话。我怎么打电话。我可以直接调用fun1()吗。如果是,那么数组的用途是什么function@Reshmikhanna它允许
    arr[expr]()
    使用
    0。那么函数数组的用途是什么呢?。fun1可以直接调用如果是这种情况,那么函数数组和函数指针funHandlr有什么用?。我们可以直接玩fun1或Fun2,对吗?