第14章 结构和其他数据形式 14.12 typedef 简介
2019独角兽企业重金招聘Python工程师标准>>>
typedef工具是一种高级数据特性,它使您能够为某一类型创建您自己的名字。在这方面,它和#define相似,但是它们有3个不同之处:
1、与#define不同,typedef给出的符号名称仅限于对类型,而不是对值 。
2、typedef的解释由编译器,而不是预处理器执行。
3、虽然它的范围有限,但在其受限范围内,typedef比#define更灵活。
假设要对1字节的数值使用术语BYTE,您只须像定义一个char变量那样定义BYTE,然后在这个定义前面加上关键字typedef,如:
typedef unsigned char BYTE;
随后,您就可以使用BYTE来定义变量了:
BYTE x,y[10], *z;
该定义的作用域取决于typedef语句所在的位置,如果定义在一个函数内部,它的作用域限定在那个函数里,如果定义在函数外部,它将具有全局作用域。
通常,这些定义使用大写字母,以提醒这个类型名称实际上是一个符号缩写。
管理变量名的同样规则也用来管理typedef使用的名字。
在前面的例子中,使用BYTE来代替unsigned char有助于说明您打算用BYTE变量来表示数值而非字符编码。使用typedef也有助于增加可移植性。例如,我们已经提到过表示sizeof运算符返回类型的size_t类型,以及表示函数time()的返回值类型的time_t类型。C标准规定sizeof和time()应返回整数类型,但它留给具体的实现来决定到底是哪种整数类型。不进行指定的原因是ANSI C委员会觉得没有一个对所有计算机平台来说都是最好的选择。因此,他们提出一个新类型名称,如,time_t,让C实现使用typedef来把这个名称设定为某种特定的数据类型。这样,他们可以提供以下通用原型:
time_t time(time_t *);
在一个系统上,time_t可能是unsigned int类型;在另一个系统上,它可能是unsigned long类型。只要包含了time.h头文件,程序就可以访问适当的定义,您也可以在代码中声明time_t变量。
使用#define可以实现typedef的一部分功能,例如:
#define BYTE unsigned char
这使预处理器用unsigned char来代替BYTE。但也有#define实现不了的功能,如下例所示:
typedef char * STRING;
如果没有关键字typedef,该例将STRING识别为一个char指针,有了这个关键字,使STRING成为char指针 的标识符。因此:
STRING name,sign;
意思是:
char *name,*sign;
但是假设这样做:
#define STRING char*
那么:
STRING name,sign;
将会被翻译成下面的形式:
char *name,sign;
在这种情况下,只有name是一个指针。
也可以对结构使用typedef:
typedef struct complex{float real;float imag;
}COMPLEX;
这样您就可以使用COMPLEX代替struct complex来表示复数。使用typedef的一个原因是为经常出现的类型创建一个方便的、可识别的名称。
使用typedef来命名一个结构类型时,可以省去结构的标记:
typedef struct {double x;double y;} rect ;
假设像下面这样使用typedef定义的类型名:
rect r1={3.0,6.0};
rect r2;
r2=r1;
将被翻译成:
struct {double x;doubley;} r1={3.0,6.0};
struct {double x;double y;} r2;
r2=r1;
如果两个结构的声明都不使用标记,但是使用相同的成员(成员名和类型都匹配),那么C认为这两个结构具有同样的类型,因此将r1赋给r2是一个正确的操作。
使用typedef的另一个原因是,typedef名称经常被用于复杂的类型。例如:
typedef char (*FRPTC())[5];
这把FRPTC声明为一个函数类型,该类型的函数返回一个指向含有5个元素的char数组的指针。
当使用typedef时,要记住它不是创建新的类型,它只是创建了便于使用的标签 。这意味着,例如,我们创建的STRING类型的变量可以作为参数传递给需要char指针类型参数的函数 。
通过结构、联合和typedef,C提供了有效和方便地处理数据的工具。
转载于:https://my.oschina.net/idreamo/blog/868051
第14章 结构和其他数据形式 14.12 typedef 简介相关推荐
- 第 14 章 结构和其他数据形式(names)
1 *--------------------------------- 2 names1.c -- 使用指向结构的指针 3 ---------------------------------*/ 4 ...
- 第十四章 结构和其他数据形式
GitHub地址,欢迎 star 文章目录 14.1 示例问题:创建图书目录 14.2 建立结构声明 14.3 定义结构变量 14.3.1 初始化结构 注意 初始化结构和类别储存期 14.3.2 结构 ...
- 《C Primer Plus》第十四章——结构和其他数据形式
文章目录 结构和其他数据形式 本章内容 示例问题:创建图书目录 建立结构声明 定义结构变量 初始化结构 访问结构成员 结构的初始化器 结构数组 声明结构数组 标识结构数组的成员 程序讨论 嵌套结构 指 ...
- C Primer Plus (第五版) 第十四章 结构和其它数据形式 编程练习
重做复习题3.但用月份名的拼写代替月份号(别忘了可以使用strcmp()). #include <stdio.h> #include <string.h>struct mont ...
- C语言基础:结构和其他数据形式
5# C语言基础:结构和其他数据形式 文章目录 Tips1:<img src="https://dl4.weshineapp.com/gif/20170410/5e0f6e9365be ...
- 【机器学习实战】第14章 利用SVD简化数据
第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition):提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生物 ...
- 【学习笔记】《深入浅出Pandas》第14章:Pandas时序数据
文章目录 14.1 固定时间 14.1.1 时间的表示 14.1.2 创建时间点 14.1.3 属性 14.1.4 时间的方法 14.1.5 时间缺失值 14.2 时长数据 14.2.1 创建时间差 ...
- 《Python数据分析与挖掘实战》第14章——基于基站定位数据的商圈分析(层次聚类)
本文是基于<Python数据分析与挖掘实战>的实战第14章<基于基站定位数据的商圈分析>做的分析. 1 挖掘背景及目标 从某通信运营商提供的特定接口解析得到用户的定位数据.利用 ...
- C语言再学习 -- 结构和其他数据形式
一.结构体 结构体可以用来创建新的数据类型,这种数据类型可以把多个其他类型合并成一个整体,采用结构体声明的变量叫做结构变量,结构体需要先声明然后才能使用,声明结构体需要使用struct关键字,结构体声 ...
最新文章
- 什么是整洁的代码?什么是肮脏的代码?
- 李飞飞重回斯坦福,Andrew Moore接手谷歌云AI
- 浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现
- 禁止word另存为,禁止图片另存为excel禁止另存为
- 理论+实践,带你掌握动态规划法
- 【算法导论】第24章迪杰斯特拉算法
- Java根类--Object类
- 全球系留无人机系统行业调研及趋势分析报告
- 乔布斯的这 3 个故事依然激励着我
- 让我摘下星星送给你_去最美的地方,我摘下星星给你。
- 累死你的不是工作方式
- React中input输入框中文输入的问题
- 云服务器和云虚拟主机有什么区别
- ------已搬运-------BUUCTF:[BJDCTF 2nd]假猪套天下第一-----------Header请求头学习!!!
- 【存储】GPFS简介及搭建
- c# picturebox控件的使用方法介绍
- Mapbox矢量瓦片pbf文件信息解析
- 华为200万年薪博士应届生大起底——8位“天才少年”的学校专业背景
- KAKA 漫威卡牌设计图首次流出!KAKA NFT 卡牌即将面向全球拍售!
- mac npm install XX权限权限报错的完美解决方法