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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yangfeng2014/article/details/50935098

问题

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

展开阅读全文

没有更多推荐了,返回首页