C语言中复杂声明详解

关于函数声明,如int f(char c),我以前一直以为左边的int代表函数返回类型,即输入参数是char c,返回一个int型的变量。现在才知道这都是误解,正解是,函数返回值为f(char c),被int定义,使得f(char c)为int型,正如同int a声明a为int型一样。

你说两种对声明的理解都可以,但是在复杂声明中就可以看出差别了。

举几个例子(选自《Linux C 一站式编程》22.9节):

1. typedef void (*sighandler_t)(int);

sighandler_t singal(int signum, sighandler_t handler);

如果把这两行合并成一行,就是:

void (*signal(int signum, void (*handler)(int)))(int);

通过这个例子我们可以分析出,typedef做的工作就是将sighandler_t后面的***带入sighandler_t中。

2. int (*(*fp)(void *))[10];

首先把外面的int (*)[10]剥开,里面是(*fp)(void *),即一个函数地址fp,输入为void *,输出是一个10个整型的数组的地址。

3. char (*(*x(void))[3])(void);

先把外面的char (*)(void)剥开,里面是(*x(void))[3],注意这里*是与数组结合还是与函数结合?因为x先与(void)结合再与*结合,故为x(void)返回的是(*)[3],即为3个成员的数组的地址,如果为函数的地址应为(*x)(void)。3个成员的数组每个成员是什么类型呢?是char (*)(void)型函数的地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值