如何以下两个代码?
//代码1
(*(void (*)())0)();
为了方便观察,首先我们应该把括号相互对应( *( void(*) () ) 0 ) (); void (*)()是一个函数指针类型,在平时写代码的过程我们应该也遇到过*(char*)p,对p强制为char*类型解引用 ,在qsort函数对冒泡实现中就用到,可以参考/RHQJA
那么这里(*(void (*)())0)();整体意思就是把0强制转化为无参,返回类型是void函数的地址,调用0地址处参数。
//代码2
void (*signal(int , void(*)(int)))(int);
为了方便观察,首先我们还是把括号相互对应void (*signal (int , void(*) (int) ))(int); 这里的void(*) (int)也是一个函数指针类型,signal是函数名,里面的(int,void(*) (int))是参数。所以以上代码是一次函数声明,声明signal函数第一个参数是int,第二个参数是函数指针,该指针指向的函数参数是int,返回类型是void,signal函数的返回类型是一个函数指针,该函数的函数指针指向的函数参数是int,返回类型是void。