《C陷阱和缺陷》中两个有趣的代码

如何以下两个代码?

//代码1
(*(void (*)())0)();

为了方便观察,首先我们应该把括号相互对应 ( *( void (*) () ) 0 ();  void (*)()   是一个函数指针类型,在平时写代码的过程 我们应该也遇到过*(char*)p,对p强制为char*类型解引用 ,在qsort函数对冒泡实现中就用到,可以参考http://t.csdn.cn/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。

猜你喜欢

转载自blog.csdn.net/includeevey/article/details/125148764
今日推荐