(*(void(*) ())0)() 是什么东东??

savagegan 2006-11-05 02:14:27
rt,个人觉得是一个“参数是函数指针void (*)(),返回值也是函数指针(* )()”的函数指针,但不理解中间那个“0”是什么意思……
请高手指教:)

...全文
1970 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
39457760 2006-11-07
  • 打赏
  • 举报
回复
楼主,下面的才是正解
你收获的那个仅仅是语法而已


回复人:Jim_King_2000() ( 三级(初级)) 信誉:100 2006-11-06 11:08:00
嵌入式系统的程序起始地址一般为0。这一点与PC不同。(PC程序的起始地址好像是FFFF0,这块地址是BIOS boot的所在地。)所以要在嵌入式系统中实现软件重启,就必须跳到地址0去执行。于是就有了上面的代码
康熙说编程 2006-11-06
  • 打赏
  • 举报
回复
大家来这里就是为了交流解决问题,不要拘泥于哪个板块,能解释问题就是对提问者的最大帮助。
tyc_2000_ren 2006-11-06
  • 打赏
  • 举报
回复
偶要 tyc2000@163.com 谢谢
Jim_King_2000 2006-11-06
  • 打赏
  • 举报
回复
嵌入式系统的程序起始地址一般为0。这一点与PC不同。(PC程序的起始地址好像是FFFF0,这块地址是BIOS boot的所在地。)所以要在嵌入式系统中实现软件重启,就必须跳到地址0去执行。于是就有了上面的代码。
做鸡真好吃 2006-11-06
  • 打赏
  • 举报
回复
路过学习~
wangye0823 2006-11-06
  • 打赏
  • 举报
回复
《C陷阱与缺陷〉
这本书有详细的解释
大家都不要吵了,
谁要看我发给他
wy3148@126.com
jiashao606 2006-11-06
  • 打赏
  • 举报
回复
C陷阱与缺陷第一章有解释
阿发伯 2006-11-06
  • 打赏
  • 举报
回复
前面打错了:
既然void (*)() == NULL == 0,那为什么不直接写0呢,就是因为void (*)()有"语义",

改为:
既然(void(*)())(0) == NULL == 0,那为什么不直接写0呢,就是因为(void(*)())(0)有"语义",
阿发伯 2006-11-06
  • 打赏
  • 举报
回复
因为楼主刚接触这种表示法,如果说得过深,反而有害,应该把最本质的东西告诉他.可能有人还会说,既然void (*)() == NULL == 0,那为什么不直接写0呢,就是因为void (*)()有"语义",这个语义是什么呢,就是说它代表无效的函数指针,就好比UINT就是unsigned int,DWORD就是unsigned long,语义不一样,本质是一样的.
Song 2006-11-06
  • 打赏
  • 举报
回复
((void *)0) 是一句没有意义的语句,一般编译器会把它去掉。
用法在ASSERT的定义中可以看到。如:
#ifdef _DEBUG
#define ASSERT ??? 如果定义了DEBUG,把ASSERT 定义为一个有意义的宏
#else
#define ASSERT ((void *)0) 否则,定义为((void *)0),这时编译器会忽略这条语句,相当 于ASSERT这一句完全不存在,不会对程序有任何影响
阿发伯 2006-11-06
  • 打赏
  • 举报
回复
NULL 和 0不一样.

NULL 是 ((void *)0) 是有语义的, 而0就是0
==================================================================================

我佩服你们的研究精神,"NULL 是 ((void *)0) 是有语义的"这句话不错,但本质还是一个0
angelleecash 2006-11-06
  • 打赏
  • 举报
回复
唉...
savagegan 2006-11-06
  • 打赏
  • 举报
回复
大家讨论的很热闹啊:P
我说说看了此贴后的收获:
此语句 = F()
F = (*f)
f = (A)0
A = void (*)()

就是0转成函数指针,该指针解引用得到改函数,对其调用。
是吧??

感谢某几位大哥的赐教和评论,让我见识不少:)

iamliadai 2006-11-06
  • 打赏
  • 举报
回复
《C陷阱与缺陷〉上有明确解释

====================
从哪里可以买到这本书啊
久仰大名了 。
iamliadai 2006-11-06
  • 打赏
  • 举报
回复
不同意楼上的,不能这样等同吧
0和null不一样
=====================================================================

NULL就是0

====================================================================


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NULL 和 0不一样.

NULL 是 ((void *)0) 是有语义的, 而0就是0
pizisanmu 2006-11-06
  • 打赏
  • 举报
回复
是个函数.
 0是变量名;变量类型*(void(*) ());void(*)()函数做参数,是一个地址;

拙见..
netxuning 2006-11-06
  • 打赏
  • 举报
回复
asouxuning@msn.com
太感谢了
xiongmao11000 2006-11-06
  • 打赏
  • 举报
回复
xiongmao11000@163.com 十分感谢
wildbeast123 2006-11-06
  • 打赏
  • 举报
回复
michael_jordan@126.com
谢谢
rotApple 2006-11-06
  • 打赏
  • 举报
回复
顶~
加载更多回复(35)

70,037

社区成员

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

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