int main()
{
(*(void(*)())0)();
return 0;
}
这段代码该如何解读呢
先从“0”入手
![](https://i-blog.csdnimg.cn/blog_migrate/e930de2a0d2adc02a02e98ef664559f7.png)
可见0前面的括号里面内容是 void(*)()
这个又是什么呢?这个是一个函数指针类型:后面的()里面是调用值,*表示指针类型,void表示返回值为空
函数指针与数组指针有相似之处:
数组指针:int (*p1) [5]
函数指针:int (*p2) (int int)
所以0从int整形被强制类型转换成函数指针类型
![](https://i-blog.csdnimg.cn/blog_migrate/2394dfbe9a6f58e9cc41fa15bc8aa179.png)
然后又被*解引用,效果相当于(函数名)(调用值),只是这里无调用因此()内为空。
—————————————————分割线——————————————————————
再看下一段代码:
int main()
{
void(*signal (int, void(*)(int) ) )(int);
return 0;
}
我们还是要一步一步分析:
![](https://i-blog.csdnimg.cn/blog_migrate/e1552a667141160b8982ce0d3aa250f5.png)
由此可见这段代码表示声明了一个signal函数,返回类型是 void(*)(int)
这里还可以使用typedef 让函数简洁一点:
int main()
{
typedef void(*pf_t)(int);//把函数指针类型命名为pf_t
pt_t signal(int, pf_t );//函数的声明
return 0;
}
如此看来就简而易懂了
遇到看似复杂的代码不要慌张,一点一点耐心地看,每个人都能成为读码大师