- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
类型定义(typedef)
C语言提供了一个称为typedef的功能,它用来建立新的数据类型名,例如,声明
typedef int Length;
将Length定义为与int具有同等意义的名字。类型Length可用于类型声明、类型转换等, 它和类型int完全相同,例如:
Length len, maxlen; Length *lengths[]; 类似地,声明
typedef char* String;
将 String 定义为与char *或字符指针同义,此后,便可以在类型声明和类型转换中使用
String,例如:
String p, lineptr[MAXLINES], alloc(int); int strcmp(String, String);
p = (String) malloc(100);
注意,typedef 中声明的类型在变量名的位置出现,而不是紧接在关键字typedef 之后。typedef 在语法上类似于存储类extern、static 等。我们在这里以大写字母作为typedef定义的类型名的首字母,以示区别。
这里举一个更复杂的例子:用typedef定义本章前面介绍的树节点。如下所示:
typedef struct tnode *Treeptr;
typedef struct tnode { /* the tree node: */ char *word; /* points to the text */
int count; /* number of occurrences */ struct tnode *left; /* left child */ struct tnode *right; /* right child */
} Treenode;
上述类型定义创建了两个新类型关键字:Treenode(一个结构)和Treeptr(一个指向该结构的指针)。这样,函数talloc可相应地修改为:
Treeptr talloc(void)
{
return (Treeptr) malloc(sizeof(Treenode));
}
这里必须强调的是,从任何意义上讲,typedef 声明并没有创建一个新类型,它只是为 某个已存在的类型增加了一个新的名称而已。typedef 声明也没有增加任何新的语义:通过
这种方式声明的变量与通过普通声明方式声明的变量具有完全相同的属性。实际上,
typedef
类似于#define 语句,但由于typedef 是由编译器解释的,因此它的文本替换功能要超过
预处理器的能力。例如:
typedef int (*PFI)(char *, char *);
该语句定义了类型PFI 是“一个指向函数的指针,该函数具有两个char *类型的参数,返回值类型为int”,它可用于某些上下文中,例如,可以用在第5章的排序程序中,如下所
示:
PFI strcmp, numcmp;
除了表达方式更简洁之外,使用typedef还有另外两个重要原因。首先,它可以使程序 参数化,以提高程序的可移植性。如果typedef声明的数据类型同机器有关,那么,当程序
移植到其它机器上时,只需改变typedef类型定义就可以了。一个经常用到的情况是,对于
各种不同大小的整型值来说,都使用通过typedef 定义的类型名,然后,分别为各个不同的
宿主机选择一组合适的short、int 和long 类型大小即可。标准库中有一些例子,例如
size_t和ptrdiff_t等。
typedef 的第二个作用是为程序提供更好的说明性——Treeptr 类型显然比一个声明为指向复杂结构的指针更容易让人理解。
文档评论(0)