永发信息网

c语言,解释下 char(*(*x()[5])() 的意思

答案:3  悬赏:0  手机版
解决时间 2021-01-27 18:40
  • 提问者网友:萌卜娃娃
  • 2021-01-27 10:56
c语言,解释下 char(*(*x()[5])() 的意思
最佳答案
  • 五星知识达人网友:雪起风沙痕
  • 2021-01-27 12:34
typedef声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的。对于char (*(*x())[5])(); 我们可利用typedef来简化。

先定义:typedef char (*Fun)(); 那么:char (*(*x())[5])(); => Fun (*x())[5];再定义:typedef Fun A[5]; 那么:Fun (*x())[5]; => A *x(); 对于这种形式正是我们最熟悉的函数声明类型。

根据上面的简化模式,可逐步描述char (*(*x())[5])();的含义:
第一步:A *x(); 声明x是一个输入参数为空且返回A的指针类型的函数。
第二步:Fun (*x())[5]; 声明x是一个输入参数为空且返回指向含有5个Fun类型数组的指针的函数。
第三步:char (*(*x())[5])(); 声明x是一个输入参数为空且返回指向含有5个指向函数指针且返回值为字符类型的数组指针的函数。
利用上述的方法,几乎可以理解任何复杂类型的声明,例如Linux系统调用函数signal的函数原型如下:
void (*signal(int signo,void (*func)(int))) (int);
对于该函数原型,给人的第一感觉就是复杂,不知从何下手。其实同样可以利用上面所讲的typedef声明来简化:先定义typedef void (*sighandler_t)(int); 那么void (*signal(int signo,void (*func)(int))) (int); => sighandler_t signal(int signo, sighandler_t handler);
对于sighandler_t signal(int signo, sighandler_t handler); 就和我们常见的函数声明非常类似了,唯一不同的是sighandler_t不是我们常见的基本数据类型,假如你不知道sighandler_t具体是什么类型,为了快速理解sighandler_t signal(int signo, sighandler_t handler);的含义,你可以把sighandler_t想象成为你最熟悉的int或char类型,对于int signal(int signo, int handler);你会很轻松的理解,对于sighandler_t signal(int signo, sighandler_t handler);你只需要了解sighandler_t的类型(即typedef void (*sighandler_t)(int);),就可以理解signal函数的完整原型声明。
本文出自 “小麦” 博客
全部回答
  • 1楼网友:笑迎怀羞
  • 2021-01-27 13:15
同意一楼的
  • 2楼网友:孤老序
  • 2021-01-27 13:09
从内向外分析:
*x() : x是一个无参数函数,该函数返回一个指针
*(*x())[5] : 由于C语言声明的优先级规则是后缀优先于前缀,所以这里就要先考虑后面的[5],再看前面的星号,于是得出: x是一个无参函数,该函数返回一个指针,返回的这个指针指向一个有5个指针元素的数组。
char(*(*x())[5])() : 依然先看后缀得知这是个函数,而且没有参数,再看前缀,结合后缀可知这是一个返回值类型为char的函数,再结合对*(*x())[5]的分析得出最后结论:
x是一个无参数函数,该函数返回一个指针,返回的这个指针指向一个有5个指针元素的数组,该数组的每个元素都可指向一个返回值类型是char的元素函数。

参考资料:《C专家编程》

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯