首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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语句中指定的那种类型的函数。如果要应用于其他函数,就必须定义另一个类型。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论