这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 东师科技爱好者 » 关于函数指针的一些小心得

共7条 1/1 1 跳转至

关于函数指针的一些小心得

菜鸟
2016-04-23 19:07:58     打赏
最近在阅读日本山田巧先生写的一段代码,里面有一段这样
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函数
2. 动态赋值 也可以先定义一个函数指针数组,在需要的时候为其赋值。为了还原其本来面目,我们先对这个执行特定类型的函数指针进行类型重定义,然后再用这个新数据类型来定义数组。如下:
1 2 3 4 typedef void(*iFunc)(void);//此类型的函数指针指向的是无参、无返回值的函数。  Funcint Array[32];//定义一个函数指针数组,其每个成员为INTFUN类型的函数指针     Array[10]=INT_TIMER0;//为其赋值     Array[10]();//调用函数指针数组的第11个成员指向的函

总的来说,个人感觉函数指针数组这种写法对于管理代码非常方便,例如我们要做一个滤波器算法,可以用函数指针数组将例如巴特沃斯啊,切比雪夫函数啊啥的统统用一个叫滤波器的数组存放起来。这样一来,代码的维护和编写都十分有利。



菜鸟
2016-04-23 19:12:41     打赏
2楼

部分资料来源http://dxlib.o.oo7.jp/index.html,可能需要翻墙。

在此感谢山田巧先生和Dxiq先生能够放下民族和政治立场问题向中国学生提供开源代码学习。


菜鸟
2016-04-23 19:35:02     打赏
3楼

函数指针数组……


之前只学过指针数组、数组作函数参数以及指向函数的指针一类的东西

感觉这种用法好省事,程序结构会灵活很多的样子 

谢谢楼主的分享~


院士
2016-04-23 22:45:56     打赏
4楼
楼主不会认为闭源的软件程序都是“罪大恶疾”吧~~

专家
2016-04-24 10:21:27     打赏
5楼
对于大型的程序,的确维护方便了。

专家
2016-04-24 20:58:27     打赏
6楼
看来我还在c的边缘活动

菜鸟
2016-05-05 22:39:24     打赏
7楼
学习了!

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]