extern void enemy_pattern0(int);extern void enemy_pattern1(int);extern void enemy_pattern2(int); extern void enemy_pattern3(int);extern void enemy_pattern4(int);extern void enemy_pattern5(int); extern void enemy_pattern6(int);extern void enemy_pattern7(int);extern void enemy_pattern8(int); extern void enemy_pattern9(int);extern void enemy_pattern10(int); void (*enemy_pattern[ENEMY_PATTERN_MAX])(int) = { enemy_pattern0, enemy_pattern1, enemy_pattern2, enemy_pattern3, enemy_pattern4, enemy_pattern5, enemy_pattern6, enemy_pattern7, enemy_pattern8, enemy_pattern9, enemy_pattern10, };
的代码,里面用到了一个函数指针数组这样一个概念,笔者对此非常感兴趣,于是稍作了研究。
源代码中,作者对这儿函数指针的用法是这样解释的:
enemy_pattern0関数~enemy_pattern10関数へ自動的に処理を渡すにはどうしたらいいでしょうか?
ここで関数ポインタというものを使ってみます。
(*enemy_pattern[ENEMY_PATTERN_MAX])(int) = { enemy_pattern0, enemy_pattern1, .....
という代入を行えば、この配列に関数のアドレスが代入されます。
虽然岛国语咱们听不懂233,但是可以大致明白,这个数组enemy_pattern里,存放的是大括号里的函数的指针。这样一来,我们需要调用哪个函数就相当方便了,例如我可以这样写
enemy_pattern[enemy[i].pattern](i);
这样我们只需要控制中括号里的值,就可以任意选择你所需要的函数了。这样一来,我们感觉就是弄了一个‘'存放函数的数组''。笔者在百度上也搜索了一下这个用法:
函数指针的声明方法为:
为函数指针数组赋值有两种方式:静态定义和动态赋值。 1. 静态定义 在定义函数指针数组的时候,已经确定了每个成员所对应的函数。例如:
1 | void(*Array[])(void)={Stop,Run,Jump}; |
1 | Array[1]();//执行Run函数 |
1 2 3 4 | typedef void(*iFunc)(void);//此类型的函数指针指向的是无参、无返回值的函数。 Funcint Array[32];//定义一个函数指针数组,其每个成员为INTFUN类型的函数指针 Array[10]=INT_TIMER0;//为其赋值 Array[10]();//调用函数指针数组的第11个成员指向的函 |