计算机C语言第09章结构和联合

上传人:ali****an 文档编号:110009105 上传时间:2019-10-28 格式:DOC 页数:20 大小:107.50KB
返回 下载 相关 举报
计算机C语言第09章结构和联合_第1页
第1页 / 共20页
计算机C语言第09章结构和联合_第2页
第2页 / 共20页
计算机C语言第09章结构和联合_第3页
第3页 / 共20页
计算机C语言第09章结构和联合_第4页
第4页 / 共20页
计算机C语言第09章结构和联合_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《计算机C语言第09章结构和联合》由会员分享,可在线阅读,更多相关《计算机C语言第09章结构和联合(20页珍藏版)》请在金锄头文库上搜索。

1、第九章 结构和联合日常生活中要处理的数据往往不是由单一类型的数据构成。例如,一个学生的基本信息就是由姓名、学号、性别、出生日期、所在院系、专业、班级等基本“数据项”共同构成。每个基本数据项都具有自己的属性(名称、数据类型、长度等)。人们常常需要对由若干不同属性的数据项所组成的整体数据进行组织和处理。但由于各数据项的属性不尽相同,所以用数组亦不能有效地对其进行组织和处理。为此,语言提供了与数组类型不同的另一种构造类型 结构类型。9.1 结构类型和结构变量和数组相似,结构也是拥有若干分量的一种构造类型。但和数组不同的是,结构的各个分量可以分别具有不同的数据类型。结构的每一个分量都称为是该结构的一个

2、“成员”。结构成员的数据类型可以是基本数据类型,也可以是指针、数组或其他结构类型。结构类型的定义形式是:struct 结构类型名类型1 成员1;类型2 成员2;类型n 成员n;例如:struct dateint year;unsigned short month;unsigned short day;在这个定义中,定义了一个新的数据类型date ,这是一个结构类型,共有三个成员,分别是year、month和day。每个成员都有自己的数据类型,比如month的数据类型是无符号短整型。定义了结构类型之后,我们便可以用其来定义相应的结构变量。可以采用以下三种方法来定义结构变量。1先定义结构类型再定义

3、结构变量首先定义一个结构类型(如上面的date),然后再用其来定义结构变量。定义形式为:struct 结构类型名 变量1,变量2,变量n;例如:struct date d1,d2;便定义了两个date型的结构变量d1和d2。同前面介绍的变量一样,每个结构变量所需的存储空间大小也是由其类型决定的。如上面d1和d2所需的存储空间大小为sizeof(struct date)个字节。注意,在用这种方法定义结构变量时,“struct”和“结构类型名”部分均不能省略。通常我们将程序中所用到的所有结构类型都在程序的头部或某一个头文件中集中定义。然后再根据需要用上述方法定义相应的结构变量。注意,定义结构类型时

4、并不产生存储分配,只有在定义结构变量时才涉及到存储分配。2在定义结构类型的同时定义结构变量我们可以在定义结构类型的同时再定义相应的结构变量。例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score; student1,student2;它的作用是定义了一个结构类型student,然后紧接着又定义了两个该类型的结构变量student1和student2。3直接定义结构变量此种方法和上面第二种方法类似,只不过没有定

5、义结构类型名。其形式为:struct 类型1 成员1;类型2 成员2;类型n 成员n; 变量1,变量2,变量n;例如:structchar name21;unsigned short age;char sex; p1,p2,p3;定义了三个结构变量p1,p2,p3。但由于没有定义相应的结构类型,所以如果以后想再定义一个同类型的结构变量p4的话,上述语句还要重写一遍。再者,当结构的类型发生变化时,结构变量的定义也需重写。因此我们不提倡用这种办法来定义结构变量,除非编程者清楚地知道以后不会再用到该结构类型。上面我们介绍了结构类型及结构变量的定义方法。此外,一个结构的成员也可以是另一个结构。例如:s

6、truct dateint year;unsigned short month;unsigned short day;struct personchar name21;char sex;struct date birthday; /* 结构person的成员birthday又是另一个结构date */char department81;9.2 访问结构成员在定义了一个结构变量之后,便可以访问这个变量的成员。引用方式为:结构变量名.成员名这里,“.”称为“成员运算符”。例如:struct date d1,d2;d1.year=2002;d1.month=12;d1.day=25;d2.year=

7、d1.year;d2.month=d1.month;d2.day=d1.day;printf(d1.year=%d, d1.month=%d, d1.day=%dn, d1.year, d1.month,d1.day);printf(d2.year=%d, d2.month=%d, d2.day=%dn, d2.year, d2.month,d2.day);从附录可知,成员运算符“”在所有的运算符中优先级最高,因此可以把上面的d1.year和d1.month 等当作为一个整体来看待。如:d1.year+; 等价于 (d1.year)+;d1.mongth+=2; 等价于 (d1.mongth)

8、+=2;d2.day=d1.day+; 等价于 d2.day=(d1.day)+;需要注意的是:l 旧的标准规定不能将一个结构变量作为一个整体直接赋给另一个具有相同结构类型的结构变量,而只能对各个成员分别赋值。如:d2.year=d1.year;d2.month=d1.month;d2.day=d1.day;l 新的标准允许将一个结构变量直接赋给另一个具有相同结构类型的结构变量。如:d2=d1;l 如果结构变量的成员本身是一个结构类型,则要用若干个成员运算符,一级一级地找到最低层的成员。且只能对最低层的成员进行赋值、存取或运算。例如:struct person myself;strcpy(my

9、self.name,ZhaoYongZhe);myself.sex=M;myself.birthday.year=1961;myself.birthday.month=4;myself.birthday.day=17;strcpy(myself.department,Computer College of Jilin University);注意:成员运算符“”是自左向右结合的。所以myself.birthday.year=1961; 等价于 (myself.birthday).year=1961;l 和数组一样,标准规定,只有当结构变量为全局变量或静态变量时,才能在定义时对其初始化(但有些编

10、译系统已取消了此限制)。例如:static struct person myself=ZhaoYongZhe,M,1961,4,17,Computer College of Jilin University;9.3 结构数组和结构指针9.3.1 结构数组当数组中的每个元素都是同一类型的结构变量时,该数组称为结构数组。例如:struct studentlong num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;/* 下面定义了一个一维student

11、型结构数组stu并对其初始化 */static struct student stu3=200101,LiuMing,M,19,1,Shanghai,78.45,200102,WangMei,F,18,2,Changchun,94.78,200101,Zhangkai,M,20,3,Beijing,54.45;9.3.2 结构指针结构对象的地址即为指向该结构对象的指针。我们可以定义一个结构指针变量来存放相应结构对象的地址。例如:struct student stu_1,stu_2,*p_stu;p_stu=&stu_1;9.3.3 通过指向结构的指针访问结构成员我们可用前面介绍的成员运算符“.

12、”来访问结构的成员。例如:struct student stu_1,stu_2,*p_stu=&stu_1;则stu_1.age=21;等价于(*p_stu).age=21;注意(*p_stu).age不能写成 *p_stu.age,这是因为成员运算符“.”的优先级高于指针运算符“*”的优先级。所以*p_stu.age等同于*(p_stu.age)而不是(*p_stu).age。由于经常要通过指向结构的指针来访问结构的成员。所以语言专门提供了一个指针成员运算符“-”。它是由一个减号“-”和一个大于号“”共同组成。其用法为:结构指针-成员名且有:“结构指针-成员名”等价于“(*结构指针).成员名

13、”。所以上面的(*p_stu).age=21;也可以写成p_stu-age=21;注意“.”和“-”的优先级相同,均是自左向右结合的。至于采用哪一个则要看是通过结构变量还是结构指针来访问结构的成员。对于结构变量,只能通过“.”来访问其成员。而对于结构指针,尽管可以通过“*”和“.”来访问其所指结构对象的成员。但我们通常采用“-”的形式。还有一点要注意的是,结构指针的增量操作也和其他指针的增量操作一样,是以其所指对象所需占用的字节数为“单位”进行的。看下面的例子:例9.1 读入10个学生的信息,然后将平均成绩最高和最低者的姓名、班级、成绩输出。#include stdio.h#define N

14、10struct student /* 定义结构类型student */long num;char name21;char sex;unsigned short age;unsigned class_num;char come_from31;float average_score;void main() struct student sN,*p,*p1,*p2;int i;for(i=0;iN;i+) /* 分别读入每个学生的信息 */printf(Input the information of Student_%d:n,i+1);printf(Num=);scanf(%d,&si.num);printf(Name=);scanf(%s,si.name);printf(Sex=);scanf(%c,&si.sex);printf(Age=);scanf(%d,&si.age);printf(Class_num=);scanf(%d,&si.class_num);printf(Com

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 教育学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号