函数指针:模块接口

icoding 2009-09-13 12:56:00
一直以来都关注语法的掌握,怎么样写是对的,可以不报错,但是不怎么关注这个语法点在程序设计时应该怎么用。。。长久以来思维都僵化了,但是发现和我差不多的哥们也有很多,今天去中关村买书,有一个哥们说他一周看完了C语言,于是我就问了一句,函数指针有什么意义,他说可以赋一个函数地址然后调用。。。

我是有点意识到原来认识是有些问题,但是转变过来还是很慢的,所以也希望大家能分享一下你们的心得,看看有没有帮助,谢谢

-----------------------------------------
个人觉得允许直接调用函数的情况下使用函数指针意义不大,觉得更多的意义是可以作为模块之间的一种接口,例子之一就是回调,比如我使用模块A的一个方法,但是这个方法又对调用者存在依赖(AJAX服务器端执行完成以后需要把数据传递回调用者就是使用回调)

A模块方法定义
void A::f(void (*pf)(char *s))
{
...
pf("...");
}

------------------------------------------
//B模块能看到的原型
void A::f(void(*pf)(char*));
//B中的函数
void B::g(char *s)
{
printf("%s",s);
}
//B可以这样使用A的方法
A::f(&g);
//由于我们不能直接修改A的代码。但是又想让A使用我们的代码那么我们就和A进行约定,定义一个函数指针作为接口让A使用我们的代码 我觉得这个时候函数指针才是有意义的
...全文
470 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiayucunyan 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jamesf1982 的回复:]
其实我在实际应用中用到的函数指针挺多的。

1.表驱动(在很多模块中,如果处理的信息过于庞大,此时使用switch case简直是受罪,而使用表驱动使得框架明了清晰)

2.回调(前面已经提供了很多)

3.接口(这个在底层用的非常多,有时为了提高效率,直接使用指针+偏移地址来调用)

4.类(用c模拟类时,你会发现事件驱动用的都是函数指针)

大概这么多吧
[/Quote]

学习了~~~
icoding 2009-09-23
  • 打赏
  • 举报
回复
t
cpu1219 2009-09-23
  • 打赏
  • 举报
回复
总结一下:贵在应用
shield0771 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jamesf1982 的回复:]
其实我在实际应用中用到的函数指针挺多的。

1.表驱动(在很多模块中,如果处理的信息过于庞大,此时使用switch case简直是受罪,而使用表驱动使得框架明了清晰)

2.回调(前面已经提供了很多)

3.接口(这个在底层用的非常多,有时为了提高效率,直接使用指针+偏移地址来调用)

4.类(用c模拟类时,你会发现事件驱动用的都是函数指针)

大概这么多吧
[/Quote]
赞同!
云梦谭 2009-09-15
  • 打赏
  • 举报
回复
建议楼主看看《用c实现面向对象》这本书。
bowfnfje 2009-09-14
  • 打赏
  • 举报
回复
学习学习
alan001 2009-09-14
  • 打赏
  • 举报
回复
up
v风雪山神庙v 2009-09-14
  • 打赏
  • 举报
回复
函数指针?指针这块本来我就挺头大,函数指针用的少,基本语法都忘了
wissup 2009-09-14
  • 打赏
  • 举报
回复
其实,做产品,或是更直接的编程的时候一般有两个层次的需要:一个是设计层面,一个是开发层面。
设计层面往往要着重满足需要,考虑如何更得体的处理数据,并且在行为方面更有效率的使用数据。
在开发层面上,往往要考虑语法要素,以及后续开发的多人协作问题,以及最重要的维护问题。

在从设计到开发过程当中,还涉及到开发工具,包括IDE,当然编译器的选择很重要,语言,你使用的是DotNet,还是C++,还是Java,或是C。

就C而言,它的语法特性决定了要实现大规模程序的时候,比较麻烦,而且后续的维护工具也很繁琐,这就是后来在发展过程中,会出现大量的面向对象语言里,提供的语法特性。

对于小程序而言,你使用什么都不要紧。但是当程序一大以后,多人协作开发就显得很重要。在这个过程当中,就如LZ所说的,模块和接口就变得很重要,而且考虑考后续的维护和扩展性,可能大家看到了很多很多的面向对象设计模式,也就是为了这些考虑,模拟功能的模块化,功能的继承性和维护得时候尽可能的简单。

当然,这些特性很复杂,用得好,可能事半功倍,用不好,就是乱来,还没有直接使用简单的函数,全局变量构成来得清晰。

之所以说这么多,想表达的一个意思是。语言本身提供了一些基本的特性,那么需要你学习的时候跳出这个语法特性,而考虑怎么应用。就像C语言的函数指针,其实语法本身不难,难的是应用,比如能够用来实现模拟面向对象里边类的成员函数,将实现和接口分开(回调),实现转换表(也就是同一个函数指针,在一定条件下,指向不同的函数定义)。

就简单的语法而言,函数指针可以用来给函数传函数参数,还可以用于调用函数。

但是当从应用角度而言的话,使用函数指针在满足基本的语法要求的基础上,那就多的多了,光一个可以将实现和接口分开,就可以实现很多很多思想了。

总结一下:贵在应用
james_hw 2009-09-14
  • 打赏
  • 举报
回复
其实我在实际应用中用到的函数指针挺多的。

1.表驱动(在很多模块中,如果处理的信息过于庞大,此时使用switch case简直是受罪,而使用表驱动使得框架明了清晰)

2.回调(前面已经提供了很多)

3.接口(这个在底层用的非常多,有时为了提高效率,直接使用指针+偏移地址来调用)

4.类(用c模拟类时,你会发现事件驱动用的都是函数指针)

大概这么多吧
kakashi0309 2009-09-14
  • 打赏
  • 举报
回复
调用动态库时 需要定义函数指针接口
bobo_2003 2009-09-14
  • 打赏
  • 举报
回复
调用函数和做函数的参数,两个主要功能
logiciel 2009-09-14
  • 打赏
  • 举报
回复
Jump-table style lookup 也是函数指针的常用方式之一:

std::map<std::string,void(*)(const Data &)> commands;
commands["cp"]=&cpF;
commands["cd"]=&cdF;
commands["mv"]=&mvF;
commands["rm"]=&rmF;
//get user input
(*commands[input])(data);
logiciel 2009-09-14
  • 打赏
  • 举报
回复
forwrj 2009-09-14
  • 打赏
  • 举报
回复
可以总结于不直接调用函数名,而是调用函数的地址.才会用到函数指针.
myhder 2009-09-14
  • 打赏
  • 举报
回复
帮顶
VirtualSniper 2009-09-14
  • 打赏
  • 举报
回复
随便看看
cba_v 2009-09-14
  • 打赏
  • 举报
回复
up up up
xiaoliang_c 2009-09-13
  • 打赏
  • 举报
回复
学习了
piaomiaoju 2009-09-13
  • 打赏
  • 举报
回复
是这样的嘛??
加载更多回复(11)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧