第9章-结构体、共用体和用户定义类型.ppt
《第9章-结构体、共用体和用户定义类型.ppt》由会员分享,可在线阅读,更多相关《第9章-结构体、共用体和用户定义类型.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第9章 结构体、共用体和用户定义类型 前言9.1 结构体 9.2 共用体 9.3 用指针处理链表 9.4 用typedef声明新类型名 前 言问题:一个学生的信息包括姓名(char型)、性别(char型)、年龄(int型)、学号(int型)、成绩(float型)等。我们如果分别定义互相独立的简单变量,显然难以反映这些数据信息的内在联系。而数据类型不同,也不能通过数组来存放。C语言允许用户根据需要自己建立一些数据类型,比如可将上述一个学生的不同类型的数据信息共同存放于构造类型结构体或者共用体结构体或者共用体中,同时,C语言也允许使用如typedef等来定义说明一个新的数据类型。9.1 结构体 9
2、.1.1 结构体类型数据的定义 9.1.2 结构体类型数据成员的引用 9.1.3 结构体数组 9.1.4 结构体指针 9.1.1 结构体类型数据的定义 用户建立由不同类型数据组成的组合型的数据结构,称之为结构体类型,组成结构体类型的每一个数据称之为该结构体类型的成员。在使用结构体类型时,首先要对结构体类型的组成进行说明,称之为结构体类型的定义。格式:struct 结构体标识名 数据类型 结构体成员名1;数据类型 结构体成员名2;数据类型 结构体成员名n;其中:“struct”为定义结构体类型的关键字。例如:以上学生的信息可定义为下列一个名为Student的结构体类型:struct Studen
3、t /Student为结构体标识名 char name20;/每个成员项以分号(;)结束 char sex;int age;int num;float score;/结构体定义以分号(;)结束以上定义中,结构体类型Student由5个成员组成。9.1.1 结构体类型数据的定义结构体类型的成员也可以包含另一个结构体类型,形成结构类型嵌套。例如:struct Date int month;int day;int year;struct Student char name20;char sex;struct Date birthday;float score;int num;struct Stude
4、nt类型的结构如右图:9.1.1 结构体类型数据的定义当结构体类型定义后,就可以指定该结构体类型的具体对象,即定义结构体类型的变量,称之为结构体变量。定义结构体变量可采取以下三种形式:1.声明结构体标识名后,再定义结构体变量2.声明结构体标识的同时定义结构体变量3.不指定结构体标识名而直接定义结构体变量 9.1.1 结构体类型数据的定义1.声明结构体标识名后,再定义结构体变量格式:struct 结构体标识名 结构体变量名表例如:在前面声明了结构体类型Student后,再来定义结构体变量stu1和stu2。struct Student stu1,stu2;这种形式和定义其它类型变量形式相似(如i
5、nt a,b;)。变量stu1和stu2则具有Student类型的数据结构,是由多个数据成员组成的构造类型的变量,如下图所示:在定义了结构体变量后,系统会为之分配内存单元,stu1和stu2分别占据一段连续的存储单元,在Visual C+环境中,stu1和stu2分别占据33字节(name 20个字节,sex 1个字节,age 4个字节,num 4个字节,score 4个字节)。9.1.1 结构体类型数据的定义2.声明结构体标识的同时定义结构体变量格式:struct 结构体标识名 数据类型 结构体成员名1;数据类型 结构体成员名2;数据类型 结构体成员名n;结构体变量名表;例如:在前面声明了结
6、构体类型Student的同时定义结构体变量stu1和stu2。struct Student char name20;char sex;int age;int num;float score;stu1,stu2;9.1.1 结构体类型数据的定义3.不指定结构体标识名而直接定义结构体变量 格式:struct /不需要指定结构体标识名 数据类型 结构体成员名1;数据类型 结构体成员名2;数据类型 结构体成员名n;结构体变量名表;例如:采用此方法定义结构体变量stu1和stu2。struct char name20;char sex;int age;int num;float score;stu1,s
7、tu2;【注意】此方法指定的是个无名的结构体类型,所以该结构体类型不能再定义其它变量。【说明】结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。结构体变量中的成员可以单独使用,运算方式和普通变量相同。结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。9.1.1 结构体类型数据的定义例9.1 下面结构体的定义语句中,错误的是(2009年9月全国计算机等级考试二级C试题选择题第36题)A)struct ord int x;int y;int z;struct ord a;B)struct ord int x;int y;i
8、nt z;struct ord a;C)struct ord int x;int y;int z;a;D)struct int x;int y;int z;a;分析:A)采用的先声明结构体类型,再定义结构体变量的方式,格式正确;C)采用的声明结构体类型的同时定义结构体变量的方式,格式正确;D)采用的不指定结构体类型而直接定义结构体变量的方式,格式正确;B)在声明结构体类型后没有用分号结束,选B。返回9.1.2 结构体类型数据成员的引用在定义了结构体变量后,就可以引用该结构体变量,执行赋值、存取和运算等操作。在引用结构体变量时,主要是通过引用结构体变量的各个成员来实现各种操作。引用结构体变量的成
9、员的方式为:格式:结构体变量名.成员名9.1.2 结构体类型数据成员的引用例9.2 把一个学生的信息(包括姓名、性别、年龄、学号、成绩)放在一个结构体变量中,然后输出这个学生的信息。#include int main()struct Student /声明Student为结构体类型 char name20;/以下五行为结构体的成员 char sex;int age;int num;float score;a=“Li Lin”,M,18,10101,86.5;/定义结构体变量a并初始化 printf(name:%snsex:%cnage:%dnNO.:%dnscore:%4.1fn,a.name
10、,a.sex,a.age,a.num,a.score);return 0;运行结果:name:Li Linsex:Mage:18NO.:10101score:86.59.1.2 结构体类型数据成员的引用【例9.2说明】“.”是成员运算符,它在所有运算符中优先级最高。可认为a.XX为一个整体。在定义结构体变量的同时可以对它的成员初始化,初始化方式和数组的初始化类似,用花括号括起来一些常量,这些常量依次对结构体变量中的各成员赋值。在引用结构体变量时,不能将一个结构体变量作为一个整体处理,而应当通过对该结构体变量的各个成员项的引用实现相应操作。若上述例题中输出写成printf(name:%snsex
11、:%cnage:%dnNO.:%dnscore:%4.1fn,a)错误。可以引用结构体成员地址和结构体变量地址。如:scanf(“%d“,&a.num);作用是从键盘为成员a.num提供值。printf(“%o“,&a);作用是输出a的首地址。但不能用以下方法整体读入结构体变量:scanf(”%s,%c,%d,%d,%f“,&a)。若成员本身又属于一个结构体类型,只能对最低级的成员进行赋值、存取以及运算。如:stu1.birthday.year=1986 结构体变量成员可以象普通变量一样进行各种运算,如:stu1.age=stu2.age(赋值运算);sum=stu1.age+stu2.age
12、(加法运算)。同类的结构体变量可以互相赋值,如 stu1=stu2。9.1.2 结构体类型数据成员的引用例9.3 设有定义:(2009年9月全国计算机等级考试二级C试题填空题第12题)struct person int ID;char name12;p;请将scanf(“%d”,);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。分析:在对结构体成员提供值时,应分别对各成员按变量方式处理。此题中,变量p的成员ID为int型数据,输入时,把p.ID看做一个整体,引用其地址,所以输入格式为:scanf(“%d”,&p.ID)。例9.4 设有定义:(2011年3月全国计算机等级考试二级C
13、试题选择题第36题)struct char mark12;int num1;double num2;t1,t2;设有若变量均已正确赋初值,则以下语句中错误的是A)t1=t2;B)t2.num1=t1.num1;C)t2.mark=t1.mark;D)t2.num2=t1.num2;分析:定义为同类型的结构体变量可互相赋值,A)正确;结构体变量成员和普通变量的运算规则相同,所以整型数据、双精度实数型数据都可直接赋值,B)、D)正确。用赋值语句将一个字符数组直接给一个字符数组是不合法的,C)错误。选C9.1.2 结构体类型数据成员的引用例9.5 有以下程序:(2010年3月全国计算机等级考试二级C
14、试题选择题第37题)#include#include struct A /定义结构体类型A int a;char b10;double c;void f(struct A t);/定义函数fmain()struct A a=1001,ZhangDa,1098.0;/定义结构体变量a并进行初始化操作f(a);/调用f函数,结构体变量a作为实参printf(%d,%s,%6.1fn,a.a,a.b,a.c);void f(struct A t)t.a=1002;strcpy(t.b,ChangRong);t.c=1202.0;程序运行后的输出结果是A)1001,zhangDa,1098.0B)10
15、02,changRong,1202.0C)1001,ehangRong,1098.0D)1002,ZhangDa,1202.09.1.2 结构体类型数据成员的引用例9.5分析:本题中函数调用的形式为传值调用,不会改变任何值。所以输出结果仍是结构体变量a原来的成员的初始值。选A。【说明】将一个结构体变量的值传递给另一个函数有三种形式:结构体变量的成员作为参数,如用a.a作为实参,将实参值传递给形成。用法同普通变量作实参相同,是“按值传递”。需要保持实参和形参类型一致。用结构体变量作为实参,同样采用“按值传递”的方式,不过是将结构体变量所有成员值按顺序传递给形参。注意形参和实参的结构类型相同,但运
16、行时占用不同的存储空间,调用时,被调函数不能修改调用函数实参的值。用结构体指针变量作为实参,即将结构体变量的首地址传递给形参,即“按地址传递”。此时,实参和形参所指向的是同一组内存单元。返回9.1.3 结构体数组结构体数组就是指数组中的每一个数组元素都是结构体类型变量。定义结构体数组方式和定义结构体变量相同。格式:struct 结构体名 结构体成员表列 数组名【数组长度】也可以先声明结构体类型,如struct Person,然后再用此类型定义结构体数组:结构体类型 数组名【数组长度】结构体数组初始化形式和数组赋初值的方式相同。在定义数组的后面加上:=初值表列;由于数组中的每个元素都是一个结构体
17、变量,通常将一个数组元素的成员放在一对花括号中,以区分各个元素。结构体数组的引用指对结构体数组元素的引用,引用结构体变量的方法适用于结构体数组元素。格式:数组元素名称.成员名结构体数组元素可赋值给同一结构体数组中的另一个元素,或者赋值给同类型的变量。9.1.3 结构体数组例9.6 有以下程序:(2011年3月全国计算机等级考试二级C试题选择题第38题)#includestruct S int a,b;data2=10,100,20,200;void main()struct S p=data1;printf(%dn,+(p.a);程序运行后的输出结果是A)10B)11C)20D)21分析:定义
18、结构体数组变量data赋初值后,相当于data0.a=10,data0.b=100,data1.a=20,data1.b=200;将data1赋值给结构体变量p,即p.a=20,p.b=200。所以,+(p.a)的值为21,选D9.1.3 结构体数组例9.7 输入三个学生的信息,包括姓名,学号,性别,成绩,输出成绩在90分以上(含90)的男生信息#include struct student /声明结构体类型student char xm20;int xh;char xb;float cj;void main()struct student stu3;/声明结构体数组 int i;for(i=
19、0;i3;i+)scanf(%s%d,%c,%f,stui.xm,&stui.xh,&stui.xb,&stui.cj);/用scanf函数输入每个学生的姓名、学号、性别、成绩 for(i=0;i=90.0)/判定性别和成绩 printf(%dt%st%4ct%5.1fn,stui.xh,stui.xm,stui.xb,stui.cj);/按学号、姓名、性别、成绩的顺序输出学生信息9.1.3 结构体数组例9.7运行结果:liyang001,m,92.5wangling1002,f,95chenyang1003,m,86.51001liyang m92.5【注意】本例中用scanf函数输入各成员
20、时,字符数组以回车作为字符串的输入结束,其它变量都用“,”隔开。返回9.1.4 结构体指针指向结构体的指针称为结构体指针变量。一个结构体变量的起始地址就是这个结构体变量的指针,结构体指针也可以指向结构体数组中的元素,即将结构体数组的起始地址赋给指针变量。结构体指针变量定义方式如下格式:struct 结构体类型*结构体指针例如:struct Student*p;/p可以指向struct Student类型的变量或者数组元素9.1.4 结构体指针例9.8 有以下定义和语句(2010年3月全国计算机等级考试二级C试题选择题第38题)struct workers /声明结构体类型struct work
21、ers int num;char name20;char c;struct int day;int month;int year;s;/成员s为另一个结构体类型;struct workers w,*pw;/定义struct workers类型变量w,以及指向struct workers类型数据的指针变量pwpw=&w;/pw指向w,即将结构体变量w的起始地址赋给指针变量w能给w中year成员赋值1980的语句是A)*pw.year=198O;B)w.year=1980;C)pw-year=1980;D)w.s.year=1980;9.1.4 结构体指针例9.8分析:year属于结构体类型str
22、uct workers的成员结构体类型s,所以要访问到year需要逐级访问,访问方式为w.s.year.。D选项可以正确赋值。对year赋值,也可采取以下方式:(*pw).s.year=1980;pw-s-year=1980【说明】(*pw)表示pw指向的结构体变量,(*pw).s.year则表示pw指向的结构体成员s的成员year。由于成员运算符“.”优先于“*”,*pw两侧括号不能省。为直观方便,C语言允许把“(*pw).”形式用“pw-”形式替代,“-”称为指向运算符,用于连接指针变量与其指向的结构体变量的成员。所以,如果pw指向结构体变量w,以下3种用法等价:1)w.成员名(如w.nu
23、m)2)(*pw).成员名(如(*pw).num)3)pw-成员名(如pw-num)指向运算符“-”优先级最高,例如+p-num等同于+(p-num),即对p-num的值做自增运算。9.1.4 结构体指针例9.9 有以下程序(2011年3月全国计算机等级考试二级C试题选择题第37题)#include struct ord /定义结构体类型struct ordint x,y;dt2=1,2,3,4;/定义结构体数组dt并对数组初始化main()struct ord*p=dt;/定义指向struct ord类型数据的指针变量p,并且p指向结构体数组dt的第一个元素的首地址 printf(%d,+(
24、p-x);printf(%dn,+(p-y);程序运行后的输出结果是A)1,2B)4,1C)3,4D)2,39.1.4 结构体指针例9.9分析:此题中,定义的结构体数组dt有两个元素,每个元素包含两个成员x和y。初始化值表示dt0.x=1,dt0.y=2,d1.x=3,dt1.y=4,p指向数组dt的第一个元素,即p-x=1,p-y=2,所以,+(p-x)=2,+(p-y)=3。选D【说明】由于指向运算符“-”优先级最高,+(p-x)等价于+p-x。但如果要求输出“(+p)-x”的值,则表示先使p增加1,此时,p指向的是数组的第2个元素的x成员值,输出结果为3,,指针p的变化如图9.4 指针p
25、的变化示意图9.2 共用体 9.2.1 共用体类型数据的定义 9.2.2 共用体类型数据成员的引用 9.2.1 共用体类型数据的定义C语言中,共用体类型数据和结构体类型数据都属于构造类型。共用体类型数据在定义上与结构体相似。区别在于,结构体变量是各类型数据成员的集合,每个成员占用不同的存储空间,结构体变量所占内存是各成员占的内存和。而共用体变量所有成员共享同一段内存单元,以最长的成员所占的内存作为共用体变量的存储空间;所有成员从同一地址开始存储,采用覆盖技术,在某一时刻只能让一个成员起作用。9.2.1 共用体类型数据的定义定义共用体类型可采取以下方式:格式:union 共用体标识名 数据类型1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 用户 定义 类型
限制150内