- 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定义的函数指针.pdf
再谈 typedef (重点为函数指针)
有种很方便的写法。
typedef int *p ;
p pointer;
这时直接把pointer 带入原式中,取代p 然后去掉typedef,得到的结果就是int * pointer;
哈哈,这样直接替换就很直观多了。
C 语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期
会遇到很多困难。typedef 是C 语言中一个很好用的工具,大量存在于已有代码中,特别值
得一提的是:C++标准库实现中更是对typedef 有着大量的使用。但很多初学者对其的理解
仅局限于:typedef 用来定义一个已有类型的别名(alias)。正是因为有了这样的理解,才有
了后来初学者在typedef int myint 和typedef myint int 之间的犹豫不决。很多国内大学的C
语言课之授课老师也都是如是说的,或者老师讲的不够透彻,导致学生们都是如是理解的。
我这里想结合C 语言标准文档以及一些代码实例,也说说typedef 。
int *p;
这样的代码是C 语言中最最基础的一个语句了,大家都知道这个语句声明了一个变量
p,其类型是指向整型的指针(pointer to int);如果在这个声明的前面加上一个typedef 后,
整个语义(semantics)又会是如何改变的呢?
typedef int *p;
我们先来看看C99 标准中关于typedef 是如何诠释的?C99 标准中这样一小段精辟的
描述:In a declaration whose storage-class specifier is typedef, each declarator defines
an identifier to be a typedef name that denotes the type specified for the identifier in the
way described in xx 。
参照这段描述,并拿typedef int *p 作为例子来理解:在一个声明中,如果有存储
类说明符typedef 的修饰,标识符p 将被定义为了一个typedef name,这个typedef name
表示(denotes)一个类型,什么类型呢?就是int *p 这个声明(declarator)中标识符
(indentifier)p 的类型(int*)。
再比对一下两个声明:
int *p;
typedef int *p;
是不是有点茅舍顿开的感觉,int *p 中, p 是一个变量,其类型为pointer to int;在int
*p 前面增加一个typedef 后,p 变为一个typedef-name,这个typedef-name 所表示的类型
就是int *p 声明式中p 的类型(int*)。说句白话,typedef 让p 去除了普通变量的身份,摇身
一变,变成了p 的类型的一个typedef-name 了。
为了巩固上面的理解,我们再来看看C 语言参考手册(C: A Reference Manual)中的说
法:任何declarator(如typedef int *p) 中的indentifier(如p)定义为typedef-name, 其(指
代p)表示的类型是declarator 为正常变量声明(指代int *p)的那个标识符(指代p)的类型
(int*)。有些绕嘴,不过有例子支撑:
[例1]
typedef double MYDOUBLE;
分析:
去掉typedef ,得到正常变量声明= double MYDOUBLE;
变量MYDOUBLE 的类型为double;
= typedef double MYDOUBLE中MYDOUBLE 是类型double 的一个typedef-name。
MYDOUBLE d; = d 是一个double 类型的变量
[例2]
typedef double *Dp;
分析:
去掉typedef ,得到正常变量声明= double *Dp;
变量Dp 的类型为double*,即pointer to double;
= typedef double *Dp中Dp 是类型double*的一个typedef-na
文档评论(0)