[C]我看到了这样的代码片断,不解其中的函数指针

avalonBBS 2006-09-23 04:00:33
gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.2 [FreeBSD] 20040728
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>make 下面的代码都没警告

#include <stdio.h>

int
test(int a)
{
printf("%d\n", a);
}

int
reffoo(int val, int (*fp) (int))
{
return fp(val);
}

int
main()
{
reffoo(3, *test);
reffoo(4, &test);
reffoo(5, test);
return 0;
}
...全文
230 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xoele 2007-01-17
  • 打赏
  • 举报
回复
c真是乱弹琴
lj860603 2006-09-23
  • 打赏
  • 举报
回复
reffoo(3, *test);
reffoo(4, &test);
reffoo(5, test);

//*test, &test, test这3个其实是一样的.test是一个函数的名字,是一个名字而已.
lann64 2006-09-23
  • 打赏
  • 举报
回复
其实就是对函数指针,只给函数名编译器就把它当作指向函数的指针,取地址&函数名,编译器还是把它当作指向函数的指针。也就是在这里用不用&得到的都是指向函数的指针。
在这里fp=&fp=指向函数的指针。
既然这样,可以推出,*fp=*(&fp)=fp,ok,*fp得到的还是同一个指向函数的指针。再多几个*,&结果还是一样。编译器就这么实现的,c里也是这么定义的。
lann64 2006-09-23
  • 打赏
  • 举报
回复
如果fp是指向函数的指针,
fp()调用和 (*fp)()调用也没有区别。
lann64 2006-09-23
  • 打赏
  • 举报
回复
reffoo(3, *test);
reffoo(4, &test);
reffoo(5, test);
==============================
一样的意思,在函数指针上三种表达没什么区别。
另外,在
int
test(int a)
{
printf("%d\n", a);
}
处应该有警告信息,函数没有明示return.
avalonBBS 2006-09-23
  • 打赏
  • 举报
回复
这样写也没事儿:reffoo(6,&****************&*&*&*test);
飞哥 2006-09-23
  • 打赏
  • 举报
回复
关注!

69,373

社区成员

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

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