6 结构
结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下
某些语言将结构称为 “ 记录 ”,比如 Pascal 语言
由于结构将一组相关的变量看作一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中
工资记录是用来描述结构的一个传统例子
每个雇员由一组属性描述,如姓名、地址、社会保险号、工资等
其中的某些属性也可以是结构,例如姓名可以分成几部分,地址甚至工资也可能出现类似的情况
C 语言中更典型的一个例子来自于图形领域:点由一对坐标定义,矩形由两个点定义,等等
ANSI 标准在结构方面最主要的变化是定义了结构的赋值操作 —— 结构可以拷贝、赋值、传递给函数,函数也可以返回结构类型的返回值
多年以前,这一操作就已经被大多数的编译器所支持,但是,直到这一标准才对其属性进行了精确定义
在 ANSI 标准中,自动结构和数组现在也可以进行初始化
6.1 结构的基本知识
首先来建立一些适用于图形领域的结构
点是最基本的对象,假定用 x
与 y
坐标表示一个点,且 x
、y
的坐标值都为整数
我们可以采用结构存放这两个坐标,其声明如下:
struct point {
int x;
int y;
};
关键字 struct
引入结构声明,结构声明由包含在花括号内的一系列声明组成
关键字 struct
后面的名字是可选的,称为结构标记(这里是 point
)
结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明,可以用它作为该声明的简写形式
结构中定义的变量称为成员
结构成员、结构标记和普通变量(即非成员)可以采用相同的名字,它们之间不会冲突,因为通过上下文分析总可以对它们进行区分
另外,不同结构中的成员可以使用相同的名字,但是,从编程风格方面来说,通常只有密切相关的对象才会使用相同的名字
struct
声明定义了一种数据类型
在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其它基本类型的变量声明是相同的:
struct { ... } x, y, z;
从语法角度来说,这种方式的声明与声明 int x, y, z;
具有类似的意义
这两个声明都将 x
、y
与 z
声明为指定类型的变量,并且为它们分配存储空间
如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓
但是,如果结构声明中带有标记,那么在以后定义结构实例时便可以使用该标记定义
例如,对于上面给出的结构声明 point
,语句 struct point pt;
定义了一个 struct point
类型的变量 pt
结构的初始化可以在定义的后面使用初值表进行,初值表中同每个成员对应的初值必须是常量表达式:struct point maxpt = {320, 200};
自动结构也可以通过赋值初始化,还可以通过调用返回相应类型结构的函数进行初始化
在表达式中,可以通过 结构名.成员
的形式引用某个特定结构中的成员
其中的结构成员运算符 .
将结构名与成员名连接起来
例如,可用 printf("%d,%d", pt.x, pt.y);
打印点 pt
的 坐标
或者通过下列代码计算原点 (0, 0)
到点 pt
的距离:
double dist, sqrt(double);
dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
结构可以嵌套,可以用对角线上的两个点来定义矩形:
struct rect {
struct point pt1;
struct point pt2;
};
结构 rect
包含两个 point
类型的成员
如果按照 struct rect screen;
方式声明 screen
变量
则可以用语句 screen.pt1.x
引用 screen
的成员 pt1
的 x
坐标