函数指针数组

数组类型:

int a[n]  -----------整型类型的数组

int *a[n] -----------指针类型的数组(指针数组)

void (*fun[n])(void)---------函数类型的数组(函数指针数组)  //定义了N个函数指针元素的数组 

 

在编写D12的控制程序时,遇到了一个数组结构的函数指针,于是我们几个人计论了大半天,最后终于搞懂它的奇妙所在。现将对它的理解叙述于下:

    首先,我们要明白如何定义一个函数指针数组。大家只要学过C的应该都能看懂下面一语句:
               void fun(void);
那么由指针的定义可以得到下面一个变化的语句:
              
               void (*fun)(void);   //  " * "先跟函数结合,说明它是一个指针,该指针指向函数fun,而且函数的输入,输出形参都是空。

我们知道一个数组的定义是这样: uchar  aaa[n];   //含N个无符号字符形元素的数组aaa
而一个指针数组是: uchar *aaa[n];  //数组aaa中存放了N个批向无符号字符型的指针地址

于是我们就可以得出结论一个函数指针数组是这样定义: void (*fun[n]) (void) ;
//定义了N个函数指针元素的数组  而函数的输入输出形参都是空。

好。说了这么多的题外话,接下说进入主题:
       在USB的标准请求中,包含了11种标准请求,而且它们都是用一个8位二进制数表示。列表如下:

      bRequest                        value

GET_STATUS                          0
CLEAR_FEATURE                   1
RESERVED                             2
SET_FEATURE                        3
RESERVED                             4
SET_ADDRESS                       5
GET_DESCRIPTOR                  6
SET_DESCRIPTOR                   7
GET_CONFIGURATION             8
SET_CONFIGURATION             9
GET_INTERFACE                     10
SET_INTERFACE                     11
SYSNCH_FRAME                    12


而我们在编写程序的时候要针对不同的请求调用不同的处理函数,我们可以用下面的方法来实现:
void request_fun(uchar bRequest)
{
       switch bRequest
       {   case  0:
                GET_STATUS( ); break;
            case 1:
                CLEAR_FEATURE( ); break;
             case 2:
                RESERVED( ); break;
             case 3:
                 SET_FEATURE( ); break;
             case 4:
                 RESERVED( ); break;
             case 5:
                 ..............
                 ..............
                ..............
       }
}

而现在我们也可以简单地用函数指针数组来实现:
先定义如下数组:
void (*request[]) (void)={

GET_STATUS                      //    0
CLEAR_FEATURE               //    1
RESERVED                        //     2
SET_FEATURE                    //    3
RESERVED                        //     4
SET_ADDRESS                    //   5
GET_DESCRIPTOR                //  6
SET_DESCRIPTOR              //     7
GET_CONFIGURATION         //    8
SET_CONFIGURATION        //     9
GET_INTERFACE                  //   10
SET_INTERFACE                //     11
SYSNCH_FRAME                //    12
}

在程序中调用:
void ( *request[ bRequest ] ) (void);

小结:当我们需要处理多个相类同的任务时,特别一任务比较多如:针对256个不同的情况进行不同的处理。就可以使用函数指针数组来实现。这样不单比使用switch语句简结,而且可能运行速率也比较高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值