C 知识量:16 - 74 - 317
typedef可用于为某一类型自定义名称。这方面与#define类似,但是两者有3处不同:
与#define不同,typedef创建的符号名只受限于类型,不能用于值。
typedef由编译器解释,不是预处理器。
在其受限范围内,typedef比#define更灵活。
下面是使用typedef的简单示例:
typedef unsigned char BYTE; typedef unsigned char byte;
typedef定义中通常使用大写字母表示被定义的名称,以提醒用户这个类型名实际上是一个符号缩写,当然,也可以用小写,就像上面那样。
以上定义的作用域取决于typedef定义所在的位置。如果定义在函数中,就具有局部作用域,受限于定义所在的函数。如果定义在函数外面,就具有文件作用域。
相对于#define,typedef有一些特有的能力,例如对于:
typedef char * STRING;
如果没有typedef关键字,编译器将把STRING识别为一个指向char的指针变量;有了typedef关键字,编译器把STRING解释成一个类型的标识符,该类型是指向char的指针。所以:
STRING name, sign;
就相当于:
char * name, * sign;
而如果使用#define代替typedef,以上声明会解释成:
char * name, sign;
这导致只有name才是指针。
此外,还可以在结构等复杂类型的定义中使用typedef,可以大大简化代码,例如定义一个复数的结构:
typedef struct { float real; float imag; } COMPLEX;
然后就可使用COMPLEX代替结构来表示复数。
最重要的一点是:typedef并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的标签。
C允许用户自定义数据形式,有时我们也会用到一些比较复杂的数据声明。其中,在声明时可使用的符号包括:
* 表示一个指针
[] 表示一个数组
() 表示一个函数
以上符号的优先级规则如下:
数组名后面的[]和函数名后面的()具有相同的优先级。它们比*(解引用运算符)的优先级高。
[]和()的优先级相同。
[]和()都是从左往右结合。
以下是一些比较复杂的声明,可以慢慢分析理解其中的含义:
int board[8][8]; // 声明一个内含int数组的数组 int ** ptr; // 声明一个指向指针的指针,被指向的指针指向int int * risks[10]; // 声明一个内含10个元素的数组,每个元素都是一个指向int的指针 int (* rusks)[10]; // 声明一个指向数组的指针,该数组内含10个int类型的值 int * oof[3][4]; // 声明一个3×4 的二维数组,每个元素都是指向int的指针 int (* uuf)[3][4]; // 声明一个指向3×4二维数组的指针,该数组中内含int类型值 int (* uof[3])[4]; // 声明一个内含3个指针元素的数组,其中每个指针都指向一个内含4个int类型元素的数组
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6