计算机C语言教程第10章结构体和共同体 课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机C语言教程第10章结构体和共同体 课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机C语言教程第10章结构体和共同体 课件 计算机 语言 教程 10 结构 共同体
- 资源描述:
-
1、结构体与共用体结构体与共用体10.1 结构体类型的定义结构体类型的定义 结构体由若干成员组成,各成员可有不同的类型。结构体由若干成员组成,各成员可有不同的类型。在程序中要使用结构体类型,必须先对结构体的组在程序中要使用结构体类型,必须先对结构体的组成进行描述。例如,学生信息可用结构体描述为:成进行描述。例如,学生信息可用结构体描述为:struct studentint num;/*学号*/char name20;/*姓名*/char sex;/*性别*/int age;/*年龄*/float score;/*成绩*/char addr40;/*家庭住址*/;需要特别指出的是“struct st
2、udent”是程序设计者自己定义的类型,它与系统预定义的标准类型(如int、char等)一样,可以用来定义变量,使变量具有struct student类型。例如:struct student st1,st220;分别定义了struct student结构体类型的变量st1和struct student结构体类型的数组变量st2。其中,关键字struct引入结构体类型的定义。struct之后任选的标识符是结构体类型的名字。用花括号括起来的是结构体成员说明。上例说明结构体类型struct student有6个成员,分别命名为num、name、sex、age、score和addr。这6个成员分别表示
3、学生的学号、姓名、性别、年龄、成绩和家庭住址,显然它们的类型是不同的。结构体类型的定义形式为:struct 结构体类型名结构体类型名成员说明表列成员说明表列;其中,花括号内的内容是该结构体类型的成员说明,每个成员说明的形式为:类型名类型名 成员名成员名;实际上,凡是相关的若干数据对象都可组合成一个结构体,在一个结构体名下进行管理。例如,由日、月、年组成的结构体类型为:struct dateint day;int month;int year;又如,某职工信息结构体类型为:struct personchar name20;/*姓名*/char address40;/*地址*/float sala
4、ry;/*工资*/float cost;/*扣款*/struct date hiredate;/*聘任日期*/;其中,结构体类型struct person含有一个结构体类型成员hiredate。该例子说明结构体类型可以嵌套定义,即一个结构体类型中的某些成员又是其他结构体类型。但是这种嵌套不能包含自身,即不能由自己定义自己。结构体类型说明中,详细列出了一个结构体的组成情况、结构体的各成员名及其类型。结构体类型说明了一个数据结构的“模式”,但不定义“实物”,并不要求分配实际的存储空间。程序要实际使用结构体,必须定义结构体变量。编译程序在为结构体变量分配存储空间时,其中各成员的存储格式及其意义与结构
5、体类型保持一致。10.2 结构体类型变量结构体类型变量 要定义一个结构体类型的变量,可采取以下要定义一个结构体类型的变量,可采取以下3种方法。种方法。10.2.1 结构体类型变量的定义 1.先定义结构体类型,再定义变量如上面已定义了一个结构体类型struct student,可以用它来定义变量。例如:struct student student1,student2;定义student1和student2为struct student类型变量,即它们具有struct student类型的结构体变量。应当注意,将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于:后者不仅要求指定
6、变量为结构体类型,而且要求指定为某一特定的结构体类型。例如,对struct student,不能只指定为struct型而不指定结构体名。而在定义变量为整型时,只需指定为int型即可。例如:struct studentint num;char name20;char sex;int age;float scorechar addr40;student1,student2;2.在定义类型的同时定义变量在定义类型的同时定义变量:struct结构体类型名结构体类型名成员说明表列成员说明表列变量名表列变量名表列;它的作用与前面定义的相同。即定义了两个struct student类型的变量student1
7、和student2。这种定义方法的一般形式为:3.直接定义结构体类型变量直接定义结构体类型变量其一般形式为:struct 成员说明表列成员说明表列变量名表列变量名表列;即在结构体定义时不出现结构体类型名,这种形式虽然简单,但不能在再需要时,使用所定义的结构体类型。(1)类型与变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配存储空间的,只对变量分配存储空间。关于结构体类型,有几点需要说明:关于结构体类型,有几点需要说明:(2)对结构体中的成员,可以单独使用,
8、它的作用与地位相当于普通变量。(3)成员也可以是一个结构体变量。例如:struct date int month;int day;int year;struct member int num;char name20;char sex;int age;struct date birthday;/*成员变量是一个结构体变量*/char addr40;stu1,stu2;(4)成员名可以与程序中的其他变量名相同,两者不代表同一对象。例如,程序中可以另定义一个变量num,它与struct member中的num是两回事,互不干扰。先定义一个struet date结构体类型,它包括3个成员:month、
9、day、year,分别代表月、日、年。然后在定义struet member结构体类型时,成员birthday的类型定义为struet date类型。已定义的类型struct date与其他类型(如int、char)一样可以用来定义成员的类型。10.2.2 结构体变量的使用 引用一个结构体变量有两种方式:通过结构体变量名和通过指向结构体的指针变量。与之对应的,引用结构体成员的标记形式也有两种,分别用运算符“”和“”来标记。(1)由结构体变量名引用其成员的标记形式为:结构体变量名结构体变量名.成员名成员名例如,stu1.num表示引用结构体变量stu1中的num成员,因该成员的类型为int型的,所
10、以可以对它施行任何int型变量可以施行的运算。例如:stu1.num20312;(2)由指向结构体的指针变量引用结构体成员的标记形式为:指针变量名指针变量名-成员名成员名例如,如下变量定义:struct nodefloat x,y;p,u,*pt;定义了两个结构体变量p、u和一个指向该结构体的指针变量pt,分析以下语句:p.x=12.2;p.y=24.3;pt=&u;pt-x23.7;pt-y=3.5;语句“pt&u;”使pt指向结构体变量u,可用pt-x和pt-y访问结构体变量u的两个成员。上述语句执行情况可用图10.1描述各变量之间的关系。23.7 3.512.2 24.3ptup图10.
11、1 通过指向结构体的指针引用结构体 上述例子说明结构体的成员可以像普通变量一样使用。根据其类型决定其所有合法的运算。如果结构体成员本身又是结构体类型的,则可继续使用成员运算符取结构体成员的结构体成员,逐级向下,引用最低一级的成员。程序能对最低一级的成员进行赋值或存取;例如,对stu1某些成员的访问:stu1.birthday.day=23;stu1.birthday.month=8;stu1.birthday.year=2003;在早期的C语言中,程序只能对结构体变量(包括结构体变量的结构体成员)取地址运算,不允许对结构体进行赋值运算。ANSI C已经取消了这个限制,允许结构体值赋给相同类型的
12、结构体变量。程序也能对结构体的最低一级的成员进行其他运算,包括取地址运算,引用成员的地址。例如:scanf(”%”,&stu1.age);10.2.3 结构体变量的初始化 结构体变量和其他变量一样,可以在定义变量的同时进行初始化。1.对外部存储类型的结构体变量进行初始化例10.1 分析下列程序的输出结果。#include struct student long num;char name20;char sex;char addr40;a=3021103,”Jiang Linpad”,M,”123 Shaoshan Road”;main()printf(”No:%ldnName:%snSex:%
13、cnAddress:%sn”,a.num,a.name,a.sex,a.addr);程序运行结果如下:No:3021103Name:Jiang LinpanSex;MAddress:123 Shaoshan Road2.在函数内部的结构体变量进行初始化上面例子的定义部分可以放到main函数中。程序如下:main()static struct student long hum;char name20;char sex;char addr40;a=3021103,”Jiang Linpan”,M,”123 Shaoshan Road”;printf(”No:%ldnName:%snSex:%cnA
14、ddress:%sn”,a.num,a.name,a.sex,a.addr);程序运行结果与上面例子程序相同。注意,对自动结构体变量不能在定义时赋初值,只能在函数执行时用赋值语句对各成员分别赋值。10.2.4 结构体变量的输入和输出 C语言不能把一个结构体变量作为一个整体进行输入或输出,应该按成员变量输入输出。例如,若有一个结构体变量:struct char name12;char addr18;long num;stud=”Wang Dawei”,”125 Beijing Road”,3021118;变量stud在内存中存储情况如图10.2所示。是按成员变量存放的。Wa n gD a w e
15、 i 01 2 5B e i j i n gR o a d 03021118 name12 addr18 图10.2 结构体变量在内存中的存储情况 为两个字符串数据和一个长整型数据,因此输出stud变量,应该使用如下方式:printf(”%s,%s,%1dn”,stud.name,stud.addr,stud.num);输入stud变量的各成员值,则用:scanf(”%s%s%ld”,stud.name,stud.addr,&stud.num);由于成员项name和addr是字符数组,按s字符串格式输入,故不要写成&stud.name和&stud.addr,而num成员是long型,故应当用&
16、stud.num。当然也可以用gets函数和puts函数输入和输出一个结构体变量中的字符数组成员。例如:gets(stud.name);puts(stud.name);gets函数输入一个字符串给stud.name,puts函数输出stud.name数组中的字符串。10.3 10.3 结构体类型数组结构体类型数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算和处理,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。10.3.1 结构体类型数
17、组的定义与定义结构体变量的方法一样,在结构体变量名之后指定元素个数,就能定义结构体数组。例如:struct student students30;struct person employees100;struct char name20;int num;float price;float quantity;parts200;以上定义了一个数组students,它有30个元素,每个元素的类型为struct student的结构体类型。定义数组employees,有100个元素,每个元素是struct person结构体类型。定义数组parts,有200个元素,每个元素也是一个结构体类型。它们都是
18、结构体数组,分别用于表示一个班级的学生、一个部门的职工、一个仓库的产品。如同元素为标准数据类型的数组一样,结构体数组各元素在内存中也按顺序存放,也可初始化,对结构体数组元素的访问也要利用元素的下标。特别地,访问结构体数组元素的成员的标记方法为:例如,访问parts数组元素的成员:parts10.price=37.5;scanf(”%s”,parts3.name);结构体数组名结构体数组名元素下标元素下标结构体成员名结构体成员名10.3.2 结构体类型数组的初始化 在对结构体数组初始化时,要将每个元素的数据分别用花括号括起来。例如:struct student char name20;long
19、num;int age;char sex;float score;students5;”Zhu Dongfen”,3021101,18,M,93,”Zhang Fachong”,3021102,19,M,90.5,”Wang Peng”,3021103,16,M,85,”Zhan Hong”,3021104,16,F,95,”Li Linggou”,3021105,20,F,67;这样,在编译时将一个花括号中的数据赋给一个元素,即将第一个花括弧中的数据送给students0,第二个花括弧内的数据送给students1,。如果赋初值的数据组的个数与所定义的数组元素相等,则数组元素个数可以省略不写
20、。这和前面有关章节介绍的数组初始化相类似。此时系统会根据初始化时提供的数据组的个数自动确定数组的大小。如果提供的初始化数据组的个数少于数组元素的个数,则方括弧内的元素个数不能省略,例如:struct studentstudents3:,;只对前3个元素赋初值,其他元素未赋初值,系统将对数值型成员赋以零,对字符型数据赋以“空”串即“0”。10.3.3 结构体数组的使用 一个结构体数组的元素相当于一个结构体变量。引用结构体数组元素有如下规则:(1)引用某一元素的一个成员。例如:studentsi.num这是序号为i的数组元素中的num成员。如果数组已如上初始化,且i=2,则相当于students2
21、.num,其值为3021103。(2)可以将一个结构体数组元素赋给同一结构体类型数组中的另一个元素,或赋给同一类型的变量。例如:struct student students3,student1;现在定义了一个结构体数组students,它有3个元素,又定义了一个结构体变量student1,则下面的赋值合法。student1=students0;students2=students1;students1=student1,(3)不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员对象进行输入输出。例如:scanf(”%s”,students0.name);printff(”%ld
22、”,&students0.num);10.4 10.4 结构体与函数结构体与函数10.4.1 结构体变量作函数参数 旧的C标准不允许用结构体变量作函数参数,只允许指向结构体变量的指针作函数参数,即传递结构体变量的首地址。新的标准以及许多C编译都允许用结构体变量作为函数参数,即直接将实参结构体变量的各个成员的值全部传递给形参的结构体变量。当然,实参和形参的结构体变量类型应当完全一致。例10.2 输入三个学生的信息并输出,其中输出的功能用一函数实现。#include#include struct stud_type char name20;long num;int age;char sex;mai
23、n()void list(struct stud_type student);struct stud_type student3,*p;int i;for(i=0,p=student;iname,&p-num,&p-age,&p-sex);for(i=0;inum,p-name,p-sex,p-score10.4.2指向结构体变量的指针作为函数参数 上一节介绍的用结构体变量作为函数参数,这是ANSI C新标准的扩充功能。在过去的C版本中不能这样用,而是通过指针来传递结构体变量的地址给形参,再通过形参指针变量引用结构体变量中成员的值。例10.3 有一结构体变量stu,内含学生学号、姓名和3门课的
24、成绩。要求在main函数中给变量赋值,在另一函数print中将它们打印输出。#include#include struct studentlong num;char name20;float score3;main()void print(struct student*);struct student stu;stu.num=3021210;strcpy(stu.name,”Li Dong”);stu.score0=67.5;stu.score1=89;stu.score2=78.6;print(&stu);void print(struct student*p)printf(”%ldn%sn
25、%fn%fn%fn”,p-num,p-name,p-score0,p-score1,p-score2);printf(”n”);程序运行结果如下:3021210Li Dong67.50000089.00000078.599998 struct student被定义为外部类型,这样同一文件中的各个函数都可以用它来定义变量的类型。main函数中的stu变量定义为struct student类型,printf函数中的形参p被定义为指向struct student类型数据的指针变量。在main函数中对stu的各成员赋值。注意在调用print函数时,用&stu作实参,&stu是结构体变量stu的地址。在
展开阅读全文