问题
(*(void(*)())0)();//何意?
void (*signal(int,void(*)(int)))(int);//何意?
idea
- 注意( )的优先级高于*
- [ ]的优先级也高于*
- 一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符就确定了,只需要把声明中的变量名和声明末尾的分号去掉,在将剩余部分用括号扩起来
- 函数返回值是函数指针的情况:void (*(f(int, char)))(int,int);函数f返回值是void(*)(int,int)
double f,g;//含义是,表达式f和g求值后为浮点数
double ((f));//((f)),求值后为浮点数
double ff();//ff()求值后为浮点数
double *pd;//*pd 为浮点数
double *g(),(*h)();//g是返回double*的函数,h是函数指针
double (*h)(); -> (double(*)())//类型转换符
//fp是一个函数指针,如何调用它呢?
(*fp)();
//调用内存地址为0处的函数
(*0)();//但是C不允许用0做函数指针
void(*fp)();//需要一个返回void的转换符
(*(void(*fp)())0)();//强制转换0,后调用这个函数指针
//优雅的方式如下:
typedef void (*funcptr)();
(*(funcptr)0)();
//signal函数两个参数,1个int,1个函数指针void(*)(int)
//void(*)(int)是用户自定义的信号处理函数
//返回值也是1个函数指针void(*)(int)
void (*signal(int,void(*)(int)))(int);
typedef void (*HANDLER) (int);
HANDLER signal(int, HANDLER);
//note:返回值是void(*)(int, char),参数是(char)的函数指针sfp定义为
void (*(sfp(char)))(int, char);
//note:返回值是void(*)(int, char),参数是(char,void(*)(int, char))的函数指针sfp定义为
void (*(sfp(char, void(*)(int, char))))(int, char);
Reference
C陷阱与缺陷