我们来思考一个问题,如果我们要保存一个年级所有学生的信息,我们该如何去做呢?一般思路是用数组去做,因为学号啊,姓名啊,成绩啊,都是同类元素的集合。但是再进一步思考发现,学生的信息还是有不少东西的,比如学号,姓名,各科成绩,电话,家庭住址,那就得要很多数组了,管理起来很麻烦。
结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。(某些语言将结构称为“记录”,比如Pascal语言。)由于结构将一组相关的变量看作一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。
又比如工资记录是用来描述结构的一个传统例子。每个雇员由一组属性描述,如姓名、地址、 社会保险号、工资等。其中的某些属性也可以是结构,例如姓名可以分成几部分,地址甚至工资也可能出现类似的情况。C语言中更典型的一个例子来自于图形领域:点由一对坐标定义, 矩形由两个点定义,等等。
在平面坐标图里面,点是最基本的对象,假定用x与y坐标表示它,且x、y的坐标值都为整数。
我们可以采用结构存放图中的两个坐标,其声明如下:
struct point { int x; int y; };
struct声明定义了一种数据类型。在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其它基本类型的变量声明是相同的。例如:
struct { ... } x, y, z;
从语法角度来说,这种方式的声明与声明
int x, y, z;
具有类似的意义。这两个声明都将x、y与z声明为指定类型的变量,并且为它们分配存储空间。
例如,对于上面给出的结构声明 point 语句:
struct point pt;
定义了一个struct point类型的变量pt。结构的初始化可以在定义的后面使用初值表进行。初值表中同每个成员对应的初值必须是常量表达式,例如:
struct point maxpt = {320, 200};
自动结构也可以通过赋值初始化,还可以通过调用返回相应类型结构的函数进行初始化。
在表达式中,可以通过下列形式引用某个特定结构中的成员:
结构名.成员
其中的结构成员运算符".”将结构名与成员名连接起来。例如,可用下列语句打印点pt的坐标:
printf("%d,%d", pt.x, pt.y);
或者通过下列代码计算原点(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类型的成员。如果按照下列方式声明screen变量: struct rect screen; 则可以用语句:
screen.pt1.x
引用screen的成员pt1的x坐标。
结构的基本情况到这里应该算描述清楚了。
现代魔法 推荐于 2013-02-27 10:23