C

C 知识量:16 - 74 - 317

14.7 其他重要内容><

typedef- 14.7.1 -

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并没有创建任何新类型,它只是为某个已存在的类型增加了一个方便使用的标签。

其他复杂的声明- 14.7.2 -

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类型元素的数组