免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4721 | 回复: 12

[C] 一个C中类型声明的问题 [复制链接]

论坛徽章:
0
发表于 2009-08-27 22:26 |显示全部楼层
5可用积分
最近开始学习C语言,遇到一个类型声明如下:

void (*signal(int signo, void (*fun(int))))(int)

看了半天不太明白,希望高手指点一下,多谢!

最佳答案

查看完整内容

这也说不通, signal返回类型和第2个参数都是函数指针类型, 但这2个函数指针类型不同。返回类型是: void (*)(int)第2个参数类型是: void* (*)(int)还是3楼说对了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-27 22:26 |显示全部楼层

回复 #6 ubuntuer 的帖子

原帖由 ubuntuer 于 2009-8-27 23:01 发表
signal函数返回的其实是指向以前的信号处理程序的指针


这也说不通, signal返回类型和第2个参数都是函数指针类型, 但这2个函数指针类型不同。
返回类型是:       void   (*)(int)
第2个参数类型是: void* (*)(int)


还是3楼说对了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-27 22:46 |显示全部楼层

回复 #1 agangaaa 的帖子

这代码让我彻底拜服了……

[ 本帖最后由 OwnWaterloo 于 2009-8-27 23:06 编辑 ]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-08-27 22:51 |显示全部楼层
楼上的错了吧,

signal返回函数指针,这个函数指针的类型是void(*)(int)

signal函数有两个参数:
第1个参数是int
第2个参数是一个函数指针类型——返回类型是void*, 接受1个int参数。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-27 22:53 |显示全部楼层

回复 #3 chenzhanyiczy 的帖子

嗯, 错了   返回类型也是 void (*)(int)。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2009-08-27 22:56 |显示全部楼层

回复 #4 OwnWaterloo 的帖子

还有错。
signal是一个函数, 不是函数指针……

论坛徽章:
0
发表于 2009-08-27 23:01 |显示全部楼层
int (*p)();
这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
int (*fun())();
这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.所以说对于



void (*signal(int signo, void (*fun)(int)))(int);

就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数), 而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.
signal函数返回的其实是指向以前的信号处理程序的指针,

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
发表于 2009-08-27 23:16 |显示全部楼层
我说嘛,lz写错代码了

我说怎么看得那么别扭
void (*fun(int))

应该是这样:
void (*fun)(int)

整个应该是这样:

void (*signal(int signo, void (*fun)(int)))(int);

论坛徽章:
0
发表于 2009-08-27 23:27 |显示全部楼层
void (*signal(int signo, void (*fun(int))))(int)
signal信号处理函数原型,signal有两个参数,一个整形,一个是有一个整形参数的func函数返回的void类型,这个函数返回一个指针,指向可以咯有一个int参数的函数并且返回一个void类型的值,这个函数太复杂,本身没有意义,一般都是用typedef之后的简单的信号处理函数

论坛徽章:
0
发表于 2009-08-28 01:39 |显示全部楼层
void (*signal(int signo, void (*fun(int))))(int)
自己按层分析
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP