当前位置:网站首页>The C Programming Language 2nd --笔记--6.7
The C Programming Language 2nd --笔记--6.7
2022-07-17 00:03:00 【YovaVan】
6.7 类型定义
C 有 typedef 功能,用来建立新的数据类型名。如,声明
typedef int Length;将 Length 定义为与 int 有相同意义的名字。类型 Length 可用于类型声明、类型转换等,它和类型 int 完全相同,如:
Length len, maxlen;
Length *Lengths[];类似地,声明
typedef char* String;/*中文*/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 the 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 strcmmp, numcpm;除了表达方式更简洁之外,使用 typedef 还有另外两个重要原因。首先,它可以使程序参数化,以提高程序的可移植性。如果typedef声明的数据类型同机器有关,那么当程序移植到其他机器上时,只需改变 typedef 类型定义就可以了。一个经常用到的情况是,对于各种不同大小的整形值来说,都是用通过 typedef 定义的类型名,然后,分别为各个不同的宿主机选择一组合适的 short、int、和 long 类型大小即可。标准库中有一些例子,例如 size_t 和 ptrdiff_t 等。
typedef 的第 2 个作用是为程序提供更好的说明性——Treeptr 类型明显比一个声明为指向复杂结构的指针更容易让人理解。
边栏推荐
猜你喜欢

数学基础02——数列极限

Initial understanding of functions - Part 1

Pytorch手动实现线性回归

Unit test (II) -- JUnit

Oracle automatic storage management 18C step-by-step installation -1

记录一次easy_sql堆叠注入

Oracle 自动存储管理 (ASM)

Detailed evaluation of current popular redis visual management tools

Detailed explanation of groupby

关于自定义监听器 onApplicationEvent方法被执行多次的问题
随机推荐
Eye of depth III - (3)] mathematics: matrix eigenvalue and eigenvector 1
vs_mpi
记录一次多个环境导致代码bug问题
2021-4-7-求最大盛水量
2022.7.1
Unit test (II) -- JUnit
Oracle database parameter change
关于自定义监听器 onApplicationEvent方法被执行多次的问题
Maker-鸿蒙应用开发培训笔记03
Pytorch手动实现线性回归
flask 快速搭建一个API
应用密码学总结
电商后台管理登录
Day07-ORM表关系及操作
深度之眼三——(3)】 数学:矩阵特征值与特征向量1
西瓜书第四章
CLI and vite realize cross domain through proxy
深度之眼三——(3)】 數學:矩陣特征值與特征向量1
flask报错No matching distribution found for flask._compat的一种解决方法
20210519-LeetCode-双指针