11.5 定义自己的数据类型
使用结构非常类似定义自己的数据类型。其实这并不完全正确,因为声明结构变量必须使用struct关键字。而声明内置类型的变量要容易一些。但是C语言的一个特性允许使用内置类型的语法来定义结构类型的变量。这个特性可以用于简化派生于内置类型的类型,在这里使用结构定义自己的数据类型。
11.5.1 结构与类型定义(typedef)功能
假设有一个结构用三个坐标x、y、z表示一个点。它的定义如下:
struct pts
{
int x;
int y;
int z;
};
现在用关键字typedef声明这个结构,如下:
typedef struct pts Point;
这条语句指定,名称Point是struct pts的同义字。声明pts结构的一些实例时,可以用下列语句:
Point start_pt;
Point end_pt;
这里声明了两个结构变量start_pt和end_pt。声明结构变量不再需要关键字struct了。声明的方式与float或int变量一样。可以组合typedef和结构声明,如下:
typedef struct pts
{
int x;
int y;
int Z;
} Point;
不要把上述语句与基本的结构声明混淆。Point不是结构变量名称,而是类型的名称。声明结构变量时,可以使用以下语句:
Point my_pt;
对一个结构类型,可以定义几种类型,但这在某些情况下会造成混淆。typedef的一种有助于理解程序的应用是,对某个数值使用基本的类型,再使用类型名称,以反映变量的类型。例如,假设程序涉及到不同种类的重量,如部件的重量和装配体的重量,此时应把类型名称weight定义为double的同义词。语句如下:
typedef double weight;
现在就可以声明weight类型的变量:
weight piston = 6.5;
weight valve = 0.35;
当然,这些变量都是double类型,因为weight只是double的同义字。还可以像平常一样声明double类型的变量。
11.5.2 使用typedef简化代码
typedef的另一个应用是简化复杂的类型。假设要经常定义结构指针pts,就可以定义一个类型,如下:
typedef struct pts *pPoint;
现在声明某些指针,可以编写:
pPoint pfirst;
pPoint plast;
这两个变量都声明为pts类型的结构指针。这样的声明可以减少编写错误,也易于了解。
在第9章中讨论过函数指针,它的声明方式更复杂。下面是一个声明函数指针的例子:
int(*pfun)(int, int); /* Function pointer declaration */
如果期望在程序中使用几个这类函数指针,可以使用typedef为该声明定义一般类型,如下:
typedef int (*function_pointer)(int, int); /* Function pointer type */
这不是声明函数指针的变量,而是将function_pointer声明为类型名称,以用来声明函数指针。所以,可以用下面的语句取代原来pfun的声明:
function_pointer pfun;
代码明显简化了。如果要声明几个这样的指针,简化的优点就更突出了。下面的语句声明了三个函数指针:
function_pointer pfunl;
function_pointer pfun2;
function_pointer pfun3;
当然,也可以初始化它们。假设有函数sum()、difference()及product(),可以声明并初始化它们,如下:
function_pointer pfunl = sum;
function_pointer pfun2 = difference;
function_pointer pfun3 = product;
这里定义的类型名称只能应用于在typedef语句中指定的那种类型的函数。如果要应用于其他函数,就必须定义另一个类型。





