巧解如何声明函数指针以及函数返回值是函数指针的函数指针

问题

(*(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陷阱与缺陷

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值