| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2602 人关注过本帖, 2 人收藏
标题:typdef的高级用法
只看楼主 加入收藏
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
结帖率:0
收藏(2)
 问题点数:0 回复次数:19 
typdef的高级用法
本人摘自《C语言与程序设计大学教程》一书8.11节,觉得对已入门者有用,因此,摘录下来。

前面阐述了使用typedef的两个原因。使用typedef的原因之三为:为复杂的声明定义一个新的简单的别名。本书把typedef的这一用法称为“高级”用法,并不是因为它有多么高深,而是因为相对难以理解一些而已。要掌握typdef的这一用法,需要读者理解各式各样的复合声明符。比如:int *(*a[5])(int, char*); 声明的是什么?

int *(*a[5])(int, char*);声明的是一个函数指针数组(名为a、数组元素个数为5),其中每个元素是一个函数指针,每一个函数指针指向的是返回值为int *类型、形参分别为int和char *的函数。显然,如果能将a[5]的声明说明符进行简化,则很容易声明数组a[5]:简化后的类型 a[5];。

那么,对声明int *(*a[5])(int, char*);,如何取新的简单的别名呢?答案是:

typdef int *(*pFun)(int, char *);  

int *(*pFun)(int, char *)声明了一个名为pFun的函数指针。上述语句的意思是:将int *(*pFun)(int, char *)中声明的函数指针pFun作为一个新的类型。

此后,pFun a[5];则与int *(*a[5])(int, char*);的作用一致。pFun a[5];声明了一个名为a,元数个数为5的数组,数组中每一个元素为pFun类型。pFun类型代表的是一个函数指针,它指向的返回值类型为int *,两个形式参数分别为int、char*类型。

例8-27 使用typedef简化声明void (*b[10]) (void (*)());。

解:void (*b[10]) (void (*)());声明的是一个函数指针数组(名为b、数组元素个数为10),其中每个元素是一个函数指针,每一个函数指针指向的返回值类型为void *,形式参数为函数指针void (*)()的函数。同理,如果能将b[10]的声明说明符进行简化,则很容易声明数组b[10],其简化声明形式为:简化后的类型 b[10];。

简化分为两步:

    第一步:对void ((*)())进行简化。具体为:typedef void((*fpPara)());,此后,void (*b[10]) (void (*)());就可以变为:void (*b[10]) (fpPara);。

    第二步:void (*b[10]) (fpPara)进行简化,具体为:typedef void (*fp)(fpPara);

从而,原声明的简化版本为:fp b[10];。

例8-28 使用typedef简化声明doube(*)() (*e)[10];。

解:doube(*)() (*e)[10]声明的是名为e的指针数组,数组元素为10个。数组中每个元素的类型为double(*)()。

为对原声明进行简化,需要对double (*)()进行简介,具体为:typedef double(*fp)(),此后, doube(*)() (*e)[10];就可以变为:fp (*e)[10];。当然,fp (*e)[10];还可以进一步简化,请读者自行处理。

    从上面的分析不难看出, 只要能读懂原声明的含义,就不难用typedef对它进行简化。
搜索更多相关主题的帖子: typdef 用法 高级 
2010-08-01 12:37
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用BJ_BOY在2010-8-1 12:37:59的发言:

本人摘自《C语言与程序设计大学教程》一书8.11节,觉得对已入门者有用,因此,摘录下来。

前面阐述了使用typedef的两个原因。使用typedef的原因之三为:为复杂的声明定义一个新的简单的别名。本书把typedef的这一用法称为“高级”用法,并不是因为它有多么高深,而是因为相对难以理解一些而已。要掌握typdef的这一用法,需要读者理解各式各样的复合声明符。比如:int *(*a[5])(int, char*); 声明的是什么?

int *(*a[5])(int, char*);声明的是一个函数指针数组(名为a、数组元素个数为5),其中每个元素是一个函数指针,每一个函数指针指向的是返回值为int *类型、形参分别为int和char *的函数。显然,如果能将a[5]的声明说明符进行简化,则很容易声明数组a[5]:简化后的类型 a[5];。

那么,对声明int *(*a[5])(int, char*);,如何取新的简单的别名呢?答案是:

typdef int *(*pFun)(int, char *);  

int *(*pFun)(int, char *)声明了一个名为pFun的函数指针。上述语句的意思是:将int *(*pFun)(int, char *)中声明的函数指针pFun作为一个新的类型。

此后,pFun a[5];则与int *(*a[5])(int, char*);的作用一致。pFun a[5];声明了一个名为a,元数个数为5的数组,数组中每一个元素为pFun类型。pFun类型代表的是一个函数指针,它指向的返回值类型为int *,两个形式参数分别为int、char*类型。

例8-27 使用typedef简化声明void (*b[10]) (void (*)());。

解:void (*b[10]) (void (*)());声明的是一个函数指针数组(名为b、数组元素个数为10),其中每个元素是一个函数指针,每一个函数指针指向的返回值类型为void *,形式参数为函数指针void (*)()的函数。同理,如果能将b[10]的声明说明符进行简化,则很容易声明数组b[10],其简化声明形式为:简化后的类型 b[10];。

简化分为两步:

    第一步:对void ((*)())进行简化。具体为:typedef void((*fpPara)());,此后,void (*b[10]) (void (*)());就可以变为:void (*b[10]) (fpPara);。

    第二步:void (*b[10]) (fpPara)进行简化,具体为:typedef void (*fp)(fpPara);

从而,原声明的简化版本为:fp b[10];。

例8-28 使用typedef简化声明doube(*)() (*e)[10];。

解:doube(*)() (*e)[10]声明的是名为e的指针数组,数组元素为10个。数组中每个元素的类型为double(*)()。

为对原声明进行简化,需要对double (*)()进行简介,具体为:typedef double(*fp)(),此后, doube(*)() (*e)[10];就可以变为:fp (*e)[10];。当然,fp (*e)[10];还可以进一步简化,请读者自行处理。

    从上面的分析不难看出, 只要能读懂原声明的含义,就不难用typedef对它进行简化。



如果你知道什么是回调函数的话。

你就不会写这么多废话了。
2010-08-01 12:41
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:0 
devil_W,何必处处显你自己NX呢?我承认你NX,呵呵,行不?
另外,这是人家书上的,我只是为了帮助大家,弄下来,让大家学习一下,你明白?
2010-08-01 12:49
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:0 
另外,我玩回调函数的时候,估计你还没上大学。我还想问下:你是哪个大学毕业的?本二?本三?
2010-08-01 12:50
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用BJ_BOY在2010-8-1 12:50:51的发言:

另外,我玩回调函数的时候,估计你还没上大学。我还想问下:你是哪个大学毕业的?本二?本三?


我想这里也许没有人比我的学历更高了。

我也相信你现在的公司也一定没有我待的公司犀利。
2010-08-01 12:56
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:0 
哈哈,那你真是坐井观天了!这样吧,咱们打个赌,如果你的学历和待遇都比我低的话,你打算怎么办?
2010-08-01 13:04
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用BJ_BOY在2010-8-1 13:04:31的发言:

哈哈,那你真是坐井观天了!这样吧,咱们打个赌,如果你的学历和待遇都比我低的话,你打算怎么办?



闲的蛋疼。

如果你告诉我你对开源做的贡献比我多,OK,也许我可以敬佩你。

你说你待遇比我多,我相信你再多也多不过盖茨。
2010-08-01 13:08
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
难道楼主是博士?薪水大于10000?


小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-08-01 13:11
BJ_BOY
Rank: 4
等 级:业余侠客
威 望:1
帖 子:77
专家分:225
注 册:2010-2-4
收藏
得分:0 
devil_W的话让我想起了凤姐,前三百年,后三百年,都无人能及你呀!
另外,你怎么知道我对开源无贡献?我要是有,你又怎么着?
呵呵,哥哥我以后也不来此地了,此地有你,臭!
我来此地,本来是想帮那些入门者学习些东西的,没想到遇到你。而有你的地方,真的就有纷争和谩骂。年轻人,你的路还长着呢。你们公司不少中上层都是我同学!
2010-08-01 13:26
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
收藏
得分:0 
老实说
我看不大明白·
悲剧
2010-08-01 13:37
快速回复:typdef的高级用法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013278 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved