(*(void (*)(void))*( 谁能帮小弟解释一下啊?前面的那部分

[复制链接]
查看11 | 回复4 | 2011-5-14 09:21:31 | 显示全部楼层 |阅读模式
主要是前面的部分不知道怎么解剖
回复

使用道具 举报

千问 | 2011-5-14 09:21:31 | 显示全部楼层
这整个是个函数调用。
1.首先(
2.*pTarget就是获得pTarget地址里面的内容,我们用target来表示。整个式子就成了(*(void(*)())target)()
3.(void(*)(void))target就是将target强制转换成一个函数指针,函数没有返回值(void)也没有参数(void),我们用pTargetFunc来表示强制转换的结果。整个式子就成了(*pTargetFunc)().
4.这就是一个函数调用了,通过函数指针调用函数。

这里面看起来比较复制的是前面的部分,但实际上你耐心的分析就会发现它只是个强制转换到函数指针的操作而已









<h4class=\"ask\">追问


那请问,那个只括着星号的括号去掉,有差别吗?
回复

使用道具 举报

千问 | 2011-5-14 09:21:31 | 显示全部楼层
有,()的优先级高于*,如果去掉了(*)的两个括号,会导致编译器解析(void(*)(void))的时候先解析(void),这会被认为是一个非法表达式。
有了两个括号,(*)的优先级就和(void)一样,它们就会按从左到右的顺序解析,这样编译器就能判断出这是个函数指针。
回复

使用道具 举报

千问 | 2011-5-14 09:21:31 | 显示全部楼层
很感谢,有点眉目了,那(*)()和(*p)()有什么差别吗?或者是前面的省略了?
回复

使用道具 举报

千问 | 2011-5-14 09:21:31 | 显示全部楼层
有差别。void(*)()给出来的是一种类型,而void(*p)();则是一句声明,它声明了类型是void(*)()的变量p.在你给出来的代码片段里面,显然不能有p,因为从上下文来看那里应该是个类型。
用typedef会比较清晰的看出这种关系。下面的代码等同于void(*p)();
typedefvoid(*FUNC_TYPE)();//定义FUNC_TYPE表示void(*)()类型。
FUNC_TYPEp;//声明一个void(*)()类型的变量
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行