《c语言程序设计基础7构造数据类型
第7章 构造数据类型 第7章 构造数据类型 第7章 构造数据类型 7.1 构造数据类型概述 构造数据类型是C语言的一个特色,它是由一些简单数据类型构造而来的。 前面所学的数组就是其中最基本的的一种。数组是由若干类型相同的元素构成,在内存中占用一块连续的区域并且按顺序存放,例如学生成绩单、字符串、矩阵、数据表格等都可以用数组来表示,它们的元素具有同样的数据类型。 但在实际程序设计中,我们经常要把一些类型不同却又紧密联系的数据项组织在一起加以处理。 7.2 结构体与结构体类型变量的定义 7.2.1 结构体的定义 就本质而言,结构体是一种较为复杂的构造类型数据。它是由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员也叫成员变量。在使用结构体类型前我们首先要对结构体内所包含信息作一说明,即定义结构体。 7.2.1 结构体的定义 struct为关键字,它表示一个结构体定义的开始,它与其后的结构体名一起代表某一特定的结构体类型。 结构体名是由用户自己定义的合法标识符。 成员表列由一对花括号括起来,其中每个成员都是该结构体的一个组成部分,并且必须列出其类型和变量的名称。结构体中各成员之间用分号隔开。 并且结构体定义也是用分号作为结束标志的,此处的分号不能省略,因为结构体定义在程序中就是一条说明语句。 7.2.1 结构体的定义 在定义结构体时,有以下几点说明: ①定义结构体类型只是说明该类结构体数据的组织形式,在程序编译时系统不会给结构体类型分配空间,只有定义了结构体变量,系统为该结构体变量分配空间。 7.2.1 结构体的定义 ②结构体成员可以是任何基本数据类型的变量,如int、char、float、double等,也可以是数组、指针类型的变量。这些成员变量可以是同一类型也可以是不同类型。 7.2.1 结构体的定义 ③结构体类型可以嵌套定义,即结构体成员也可以是结构体类型的变量。 7.2.2 结构体变量的定义 为了能够在程序中使用结构体类型,必须定义结构体类型的变量,定义结构体变量的方法主要有以下四种: ⑴先定义结构体类型,再定义结构体变量。 7.2.2 结构体变量的定义 ⑵在定义结构类型的同时定义结构体变量。 ⑶直接说明结构体变量。 7.2.2 结构体变量的定义 ⑷先使用typedef定义结构体类型,给结构体类型起别名,再用别名定义结构体变量。 这样在定义结构体变量的时候就可以既使用新的类型studentinfo来定义变量,又可以用struct student 来定义变量, 7.2.2 结构体变量的定义 按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。以上定义的结构体变量各成员所占内存单元如表所示(以VC环境为例): 7.3 结构体变量的使用及初始化 7.3.1 结构体变量的使用 结构体作为一种新的数据类型,在定义结构体变量之后,可以像基本类型变量一样赋值、运算,不同的是结构体变量不能整体引用,只能引用它的成员变量。 7.3.1.1 结构体成员变量使用的一般方式 结构体变量名.成员名 birthday.year、birthday.month、birthday.day 7.3.1 结构体变量的使用 可以将一个结构体变量赋值给另一个结构体变量。 进行赋值的结构体变量必须是同一类型的结构体变量。如果stu1已经赋值,则可以通过语句stu2=stu1将stu1的值赋给同类型的结构体变量stu2。 7.3.1 结构体变量的使用 7.3.1 结构体变量的使用 7.3.1.2 嵌套结构体中成员变量的使用 对于嵌套的结构体,如果要使用内部嵌套的结构体的成员变量,则需要连续的使用“.”运算符。 使用内部结构体的成员变量month用“stu1.date.month”的形式。 7.3.1 结构体变量的使用 7.3.2 结构体变量的初始化 对应结构体变量的定义形式,结构体变量初始化也有四种方法: 初始表中数据的个数应和成员项一致,各初值间用逗号隔开。按成员的先后顺序对应赋值,如果初值个数少,则将无初值对应的成员赋以0值。如果初值个数多,则编译出错。有嵌套结构的结构体类型,赋初值也一一对应。 7.4 结构体数组 7.4.1 结构体数组的定义 ⑴先定义结构体类型,再定义结构体数组。 ⑵在定义结构类型的同时说明结构体数组。 7.4.1 结构体数组的定义 ⑶直接说明结构体数组。 ⑷使用typedef定义结构体类型,再定义数组。 7.4.2 结构体数组的初始化 ⑴定义结构体类型时初始化结构体数组。 ⑵先定义结构体类型,然后定义结构体数组并初始化。 7.4.3 结构体数组的使用 ⑴可以把一个数组元素赋予另一