(三)知识准备

(三)知识准备

在实际生活和程序设计中,有些数据是有内在联系的。例如,一位同学的学号、姓名、性别、年龄、成绩等,是同属于一位同学的,见表9-1。其中,学号num、姓名name、性别sex、年龄age、成绩score都属于Zhan San同学的信息。如果把学号num、姓名name、性别sex、年龄age、成绩score分别定义为单独的变量,它们之间的内在联系就难以反映出来,这时需要一种新的数据类型,那么如何设计一种新型的数据类型呢?

表9-1 一位同学的信息

C语言允许用户基于已有的数据类型(int、char、float、double等)创造和组装,设计组合型的数据类型,这种新的数据类型称为结构体。

小贴士

结构体不是变量,是一种数据类型,是由用户设计的一种自定义的类型。

在程序中建立一个结构体类型,用来表示表9-1中所表示的数据结构。

以上是结构体类型的定义,struct是关键字,struct后的Student是新类型的名字。

声明一个结构体类型的一般形式为:

花括号内的成员列表是该结构体所包含的子项,称为结构体的成员。例如上面程序中的num、name、sex、age、score等都是成员。

对各成员都需要进行类型声明,即

与定义变量一样,必须基于已有的数据类型,可以是int、char、float等基本类型,也可以是已定义的结构体类型。

小贴士

新类型的名字是struct Student,是一个合法的数据类型,而不是Student。在C语言中,涉及结构体的类型名必须带有关键字struct,否则编译系统会报错。

在程序中,可以设计许多种结构体类型,例如struct Student、struct Teacher、struct Mode等,每种结构体类型包含不同的成员。

现在有了struct Student这一结构体数据类型,可以用来定义变量,表示与学生相关的一些信息。

在前面已经定义了结构体类型struct Student,现在用该类型定义变量:

其中,struct Student是数据类型;boy1、girl2是变量,其类型是struct Student。与定义整型变量的写法

类似。

声明类型和定义变量分离,在声明类型后,可以根据需要随时定义变量,比较灵活。

两个变量boy1、girl2的空间情况如图9-1所示。

图9-1 结构体变量

由5部分组成:num、name、sex、age、score。这些组成部分就是按照结构体类型定义时所规定的各个成员及顺序来组织的。在num区域存放学生的学号,name区域存放学生的姓名,sex区域存放学生的性别,age区域存放学生的年龄,score区域存放学生的成绩,使用一个struct Student类型的变量就可以存储一名学生的整套相关信息。boy1、girl2两个变量分别存放2名学生的信息,互不干扰。

(1)在声明类型的同时定义变量

例如:

上面的程序在定义struct Student类型的同时,定义了两个struct Student类型的变量boy3和girl4。

这种定义方式的一般形式为:

这种方式能够直接看到结构体的结构组成,比较直观,在写小程序时使用比较方便。

(2)不指定类型名,直接定义结构体类型变量

一般形式为:

设计了一个无名的结构体类型,没有出现结构体名,针对一次性使用的结构体变量比较方便。该结构体类型不能再定义新的变量了。

(3)结构体变量的初始化与引用

在定义结构体变量的同时,可以对它进行初始化,即赋初始值。

例如:

程序中声明了一个结构体名为Student的结构体类型struct Student,有5个成员。在声明结构体类型的同时,定义了结构体变量boy3,并进行了初始化。在变量名boy3后面的花括号内提供了各成员的值,将201804101、"Li Ming"、'M'、17、85.2按顺序依次分别赋给boy3变量的成员num、name、sex、age、score。

在声明结构体类型后,定义了结构体变量girl4,进行初始化。在变量名girl4后面的花括号内提供了各成员的值,将201804105、"Li Li"、'F'、16、80.5按顺序依次分别赋给girl4变量的成员num、name、sex、age、score。

① 在定义结构体变量时,可以对它的成员进行初始化。初始化列表使用花括号括起来,花括号内的各个常量依次赋给结构体变量中的各个成员。

② 引用结构体变量中的成员,引用方式为:

这里的符号点(.)称为成员选择符,相当于“的”,在所有的运算符中优先级最高。可以把boy3.num作为一个整体来看待,相当于一个变量。

例如:

③ 结构体变量的成员可以像普通变量一样进行各种运算。

例如:

④ 同类型的结构体变量之间可以相互赋值,例如:

⑤ 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。