《c语言数组的改变.ppt》由会员分享,可在线阅读,更多相关《c语言数组的改变.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1构造数据类型构造数据类型 内容提示内容提示关键词关键词 结构体结构体 共用体共用体 枚举枚举 位段位段 自定义类型自定义类型2从基本数据类型、复合数据类型到抽象数据类型从基本数据类型、复合数据类型到抽象数据类型从基本数据类型、复合数据类型到抽象数据类型从基本数据类型、复合数据类型到抽象数据类型 高级语言设计了基本数据类型:整型、高级语言设计了基本数据类型:整型、高级语言设计了基本数据类型:整型、高级语言设计了基本数据类型:整型、浮点型、字符型等。浮点型、字符型等。浮点型、字符型等。浮点型、字符型等。基本数据类型并不能方便地解决所有问基本数据类型并不能方便地解决所有问基本数据类型并不能方便地解
2、决所有问基本数据类型并不能方便地解决所有问题。题。题。题。复合数据类型是基本数据类型迭代派生复合数据类型是基本数据类型迭代派生复合数据类型是基本数据类型迭代派生复合数据类型是基本数据类型迭代派生而来。而来。而来。而来。典型的代表就是典型的代表就是典型的代表就是典型的代表就是“结构结构结构结构”,数组、指针,数组、指针,数组、指针,数组、指针也可算作此类。也可算作此类。也可算作此类。也可算作此类。3思考一个问题思考一个问题 在程序里表示一个人(姓名、年龄、性别、在程序里表示一个人(姓名、年龄、性别、在程序里表示一个人(姓名、年龄、性别、在程序里表示一个人(姓名、年龄、性别、),怎么表示?),怎么
3、表示?),怎么表示?),怎么表示?想表示多个人呢?想表示多个人呢?想表示多个人呢?想表示多个人呢?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理?某学校学生成绩管理表某学校学生成绩管理表4数组的解决方法数组的解决方法int int studentId30;studentId30;/*/*最多可以管理最多可以管理最多可以管理最多可以管理3030个学生个学生个学生个学生,每个学每个学每个学每个学生的学号用数组的下标表示生的学号用数组的下标表示生的学号用数组的下标表示生的学号用数组的下标表示*/charc
4、har studentName3010;studentName3010;charchar studentSex302;studentSex302;int int timeOfEnter30;/*timeOfEnter30;/*入学时间用入学时间用入学时间用入学时间用intint表示表示表示表示*/int int scoreComputer30;/*scoreComputer30;/*计算机原理成绩计算机原理成绩计算机原理成绩计算机原理成绩*/int int scoreEnglish30;/*scoreEnglish30;/*英语课成绩英语课成绩英语课成绩英语课成绩*/5数组的解决方法数组的解决
5、方法int studentId30=1,2,3,4,5,6;int studentId30=1,2,3,4,5,6;charcharstudentName3010=studentName3010=令狐冲令狐冲令狐冲令狐冲,林平之林平之林平之林平之,岳灵珊岳灵珊岳灵珊岳灵珊,任莹莹任莹莹任莹莹任莹莹;charcharstudentSex302=studentSex302=男男男男,男男男男,女女女女,女女女女;int int timeOfEnter30=1999,1999,1999,1999;timeOfEnter30=1999,1999,1999,1999;int int scoreCompu
6、ter30=90,78,89,78;scoreComputer30=90,78,89,78;int int scoreEnglish30=83,92,72,95;scoreEnglish30=83,92,72,95;int int scoreMath30=72,88,98,87;scoreMath30=72,88,98,87;6数组的解决方法数组的解决方法数据的内存管理方式数据的内存管理方式 907889788392729572889887827866901234令狐冲令狐冲林平之林平之岳灵珊岳灵珊任莹莹任莹莹男男男男女女女女19991999199919997分配内存不集中,寻址效率不高分配内
7、存不集中,寻址效率不高 对数组进行赋值时,容易发生错位对数组进行赋值时,容易发生错位 结构显得比较零散,不容易管理结构显得比较零散,不容易管理 数组的解决方法数组的解决方法8希望的内存分配图希望的内存分配图 1令狐冲令狐冲男男1999908372822林平之林平之男男1999789288783岳灵珊岳灵珊女女1999897298664任莹莹任莹莹女女1999789587909结构体的解决方法结构体的解决方法struct STUDENT struct STUDENT struct STUDENT struct STUDENT int studentID;int studentID;int stu
8、dentID;int studentID;/*/*/*/*每个学生的序号每个学生的序号每个学生的序号每个学生的序号*/char studentName10;char studentName10;char studentName10;char studentName10;/*/*/*/*每个学生的姓名每个学生的姓名每个学生的姓名每个学生的姓名*/char studentSex4;char studentSex4;char studentSex4;char studentSex4;/*/*/*/*每个学生的性别每个学生的性别每个学生的性别每个学生的性别*/intintintinttimeOfEnt
9、er;timeOfEnter;timeOfEnter;timeOfEnter;/*/*/*/*每个学生每个学生每个学生每个学生的的的的入学时间入学时间入学时间入学时间*/intintintintscoreComputer;scoreComputer;scoreComputer;scoreComputer;/*/*/*/*每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩*/intintintintscoreEnglish;scoreEnglish;scoreEnglish;scoreEnglish;/*/*/*/*每个学生的英语成绩每个学生的英语成
10、绩每个学生的英语成绩每个学生的英语成绩*/intintintintscoreMath;scoreMath;scoreMath;scoreMath;/*/*/*/*每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩*/;10 struct STUDENT是一个数据类型 struct STUDENT students30;students0.studentSex它们都是变量,一般称为结构的成员变量struct STUDENT struct STUDENT struct STUDENT struct STUDENT int studentID;/*int studentID;/
11、*int studentID;/*int studentID;/*每个学生的序号每个学生的序号每个学生的序号每个学生的序号*/char studentName10;/*char studentName10;/*char studentName10;/*char studentName10;/*每个学生的姓名每个学生的姓名每个学生的姓名每个学生的姓名*/char studentSex4;/*char studentSex4;/*char studentSex4;/*char studentSex4;/*每个学生的性别每个学生的性别每个学生的性别每个学生的性别*/intintintinttimeO
12、fEnter;/*timeOfEnter;/*timeOfEnter;/*timeOfEnter;/*每个学生的入学时间每个学生的入学时间每个学生的入学时间每个学生的入学时间*/intintintintscoreComputer;/*scoreComputer;/*scoreComputer;/*scoreComputer;/*每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩每个学生的计算机原理成绩*/intintintintscoreEnglish;/*scoreEnglish;/*scoreEnglish;/*scoreEnglish;/*每个学生的英语成绩每个学生
13、的英语成绩每个学生的英语成绩每个学生的英语成绩*/intintintintscoreMath;scoreMath;scoreMath;scoreMath;/*/*/*/*每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩每个学生的数学成绩*/;117.17.1 结构体结构体 结构体类型的定义结构体类型的定义结构体类型的定义结构体类型的定义 结构体是一种构造数据类型,它由若干成员组成。结构体是一种构造数据类型,它由若干成员组成。结构体是一种构造数据类型,它由若干成员组成。结构体是一种构造数据类型,它由若干成员组成。每一个成员既可以是一个基本数据类型也可以是每一个成员既可以是一个基本数据类型也
14、可以是每一个成员既可以是一个基本数据类型也可以是每一个成员既可以是一个基本数据类型也可以是一个构造数据类型。一个构造数据类型。一个构造数据类型。一个构造数据类型。struct 结构体名结构体名 类型类型1 成员成员1;类型类型2 成员成员2;.类型类型n 成员成员n;12结构体类型的定义结构体类型的定义结构体类型的定义结构体类型的定义struct studentchar cNum;char cName20;int nAge;char cSex;结构体关键字结构体关键字结构体名结构体名分号是结束标志,不能省略分号是结束标志,不能省略结构体的结构体的4 4个成员个成员7.1 结构体结构体 13st
15、ruct date int nYear;int nMonth;int nDay;struct student char cNum;char cName20;struct date dBirthday;struct student char cNum;char cName20;struct date int nYear,nMonth,nDay;dBirthday;7.1.1 结构体嵌套定义结构体嵌套定义等价14 结构体的定义只定义了数据结构体的定义只定义了数据的形式,即声明了一种复杂的数的形式,即声明了一种复杂的数据类型,并未生成任何变量。据类型,并未生成任何变量。157.1.2 结构体变量结构
16、体变量 (1)(1)结构体变量的定义结构体变量的定义结构体变量的定义结构体变量的定义 先定义结构体类型,再声明结构体变量。其一般形式为:先定义结构体类型,再声明结构体变量。其一般形式为:先定义结构体类型,再声明结构体变量。其一般形式为:先定义结构体类型,再声明结构体变量。其一般形式为:struct 结构体名结构体名 结构体变量名结构体变量名;struct student char cNum;char cName20;int nAge;char cSex;struct student sStu;16定义结构体类型的同时定义结构体变量。其一般形定义结构体类型的同时定义结构体变量。其一般形定义结构体
17、类型的同时定义结构体变量。其一般形定义结构体类型的同时定义结构体变量。其一般形式为:式为:式为:式为:如,如,如,如,struct studentstruct studentstruct studentstruct studentchar cNum;char cNum;char cNum;char cNum;char cName20;char cName20;char cName20;char cName20;int nAge;int nAge;int nAge;int nAge;char cSex;char cSex;char cSex;char cSex;sStu;sStu;sStu;sS
18、tu;struct 结构体名结构体名 成员列表成员列表变量列表变量列表;17直接定义无结构名的结构体类型变量直接定义无结构名的结构体类型变量直接定义无结构名的结构体类型变量直接定义无结构名的结构体类型变量 如,如,如,如,struct struct char cNum;char cNum;char cName20;char cName20;int nAge;int nAge;char cSex;char cSex;sStu;sStu;struct 成员列表成员列表变量列表变量列表;18(2)结构体变量的初始化结构体变量的初始化以上三种方式声明结构体变量的同时都可以以上三种方式声明结构体变量的同
19、时都可以进行初始化。初始化方式为:将所赋初值按进行初始化。初始化方式为:将所赋初值按顺序放在一对大括号内,下面以第一种定义顺序放在一对大括号内,下面以第一种定义结构体变量的方式为例来说明初始化问题。结构体变量的方式为例来说明初始化问题。如,如,struct studentstruct studentchar cNum;char cNum;char cName20;char cName20;int nAge;int nAge;char cSex;char cSex;struct student sStu=1,Zhanghua,20,M;struct student sStu=1,Zhanghua
20、,20,M;注意注意(1)如下初始化形式是非法的。如下初始化形式是非法的。struct student sStu;sStu=0501,Zhao lin,20,M;(2)所赋初值与各成员数据类型要所赋初值与各成员数据类型要匹配或兼容。匹配或兼容。19(3)(3)结构体变量成员的引用结构体变量成员的引用 结构体变量成员的引用形式如下:结构体变量成员的引用形式如下:结构体变量成员的引用形式如下:结构体变量成员的引用形式如下:结构体变量名结构体变量名结构体变量名结构体变量名.成员名成员名成员名成员名 实心点实心点实心点实心点“.”.”.”.”称为成员运算符。称为成员运算符。称为成员运算符。称为成员运算
21、符。例如:例如:例如:例如:sStu.cNum sStu.cNamesStu.cNum sStu.cNamesStu.cNum sStu.cNamesStu.cNum sStu.cName 20 例例例例7-17-17-17-1定义并初始化学生结构体变量,然后输出变量定义并初始化学生结构体变量,然后输出变量定义并初始化学生结构体变量,然后输出变量定义并初始化学生结构体变量,然后输出变量的各成员值。的各成员值。的各成员值。的各成员值。#includestruct studentchar*pcNum;char*pcName;char cSex;struct dateint nYear,nMonth
22、,nDay;dBirth;float fScore;sStu1=0804101,Mr.Zhang,M,1979,9,1,80,sStu2;21void main()sStu2=sStu1;/*同类型的结构体变量之间进行赋值运算*/printf(Number=%sn,sStu2.pcNum);printf(Name=%sn,sStu2.pcName);printf(Born=%d年年,);printf(%d月月,sStu2.dBirth.nMonth);printf(%d日日n);printf(Sex=%cn,sStu2.cSex);printf(Score=%.1fn,sStu2.fScore
23、);22结构体数组结构体数组 在实际应用中,经常用结构体数组来表示具有相同数据在实际应用中,经常用结构体数组来表示具有相同数据在实际应用中,经常用结构体数组来表示具有相同数据在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。结构的一个群体。结构的一个群体。结构的一个群体。如,如,如,如,struct studentstruct student char*pcNum;char*pcNum;char*pcName;char*pcName;char cSex;char cSex;struct datestruct dateint nYear,nMonth,nDay;int nYear,
24、nMonth,nDay;dBirth;dBirth;float fScore;float fScore;结构体数组结构体数组结构体数组结构体数组sStusStu,共有,共有,共有,共有5 5个元素:个元素:个元素:个元素:sStu0sStu4sStu0sStu4。在声明的时候还完成了对数组的初始化工作。在声明的时候还完成了对数组的初始化工作。在声明的时候还完成了对数组的初始化工作。在声明的时候还完成了对数组的初始化工作。struct student sStu5=0804101,Mr.Zhang,M,1979,9,1,80,0804102,Mr.Wang,W,1980,8,1,70,080410
25、3,Mr.Li,M,1978,7,1,55,0804104,Mr.Zhao,W,1977,6,1,65,0804105,Mr.Zhou,M,1981,5,1,45;23定义定义定义定义:struct STUDENTintstudentID;charstudentName10;char studentSex4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic;struct STUDENT stu5;结结结结构构构构体体体体数数数数组组组组学号学号姓名姓名性别性别入学时间入
26、学时间计算机计算机原理原理年年月月日日英语英语数学数学音乐音乐24struct STUDENTintstudentID;charstudentName10;char studentSex4;struct date timeOfEnter;int scoreComputer;int scoreEnglish;int scoreMath;int scoreMusic;struct STUDENT stu4=1,令狐冲令狐冲,男男,1999,12,20,90,83,72,82,2,林平之林平之,男男,1999,07,06,78,92,88,78,3,岳灵珊岳灵珊,女女,1999,07,06,89,7
27、2,98,66,4,任莹莹任莹莹,女女,1999,07,06,78,95,87,90 ;初始化初始化初始化初始化结构体数组结构体数组结构体数组结构体数组25 例例7-27-2计算计算5 5名学生的平均成绩名学生的平均成绩和不及格的人数。和不及格的人数。26struct student char*pcNum;char*pcName;char cSex;struct date int nYear,nMonth,nDay;dBirth;float fScore;struct student sStu5=0804101,Mr.Zhang,M,1979,9,1,80,0804103,Mr.Li,M,19
28、78,7,1,55,0804104,Mr.Zhao,W,1977,6,1,65,0804105,Mr.Zhou,M,1981,5,1,45;27void main()int i,nE=0;float fAvg,fSum=0;for(i=0;i5;i+)fSum+=sStui.fScore;if(sStui.fScorex=0;/*指向运算符*/第二种更常用xypptpt34看下面的例子:void main()struct student char*pcNum;char*pcName;char cSex;struct date int nYear,nMonth,nDay;dBirth;float
29、 fScore;*psStu,sStu=0804101,Mr.Zhang,M,1979,9,1,80;psStu=&sStu;/*使psStu指向sStu*/printf(“pcNum=%sn,psStu-pcNum);结构体指针变量psStu指向了结构体变量sStu的首地址,即通过psStu可以实现操作sStu目的。输出结果输出结果pcNum=080410135思考一struct pointint x;int y;struct rectstruct point pt1;struct point pt2;struct rect rt,*rp=&rt;下面表达式哪些合法?下面表达式哪些合法?(*
30、rp).pt1.xrp-pt1.xrt-pt1.x上面合法的表达式都是等价上面合法的表达式都是等价的吗?的吗?36(3)指向结构体数组 struct telephonechar cName20;char cPhone10;struct telephone tTel3,*ptTel;ptTel=tTel;由于指针ptTel指向了数组tTel的首地址,则通过ptTel可以实现操作数组tTel元素的目的。3738例例7-5运用结构体指针变量实现例运用结构体指针变量实现例7-3的功能。的功能。例例7-3 7-3 建立一个电话本。建立一个电话本。问题描述:建立一个简单的电话本,问题描述:建立一个简单的电
31、话本,每条记录包括姓名和联系电话,共每条记录包括姓名和联系电话,共2 2项。项。39#define NUM 3struct telephone char cName20;char cPhone10;void main()struct telephone tTelNUM,*ptTel;for(ptTel=tTel;ptTelcName);printf(input phone:);gets(ptTel-cPhone);printf(namettphonen);for(ptTel=tTel;ptTelcName,ptTel-cPhone);40结构体与函数 结构体变量既可以做函数的参数也可以做函数的
32、结构体变量既可以做函数的参数也可以做函数的结构体变量既可以做函数的参数也可以做函数的结构体变量既可以做函数的参数也可以做函数的返回值。返回值。返回值。返回值。结构体变量作函数参数传递的是所有成员,因此,结构体变量作函数参数传递的是所有成员,因此,结构体变量作函数参数传递的是所有成员,因此,结构体变量作函数参数传递的是所有成员,因此,实参与形参必须是相同类型的结构体变量。实参与形参必须是相同类型的结构体变量。实参与形参必须是相同类型的结构体变量。实参与形参必须是相同类型的结构体变量。结构体变量做函数的返回值,返回给主调函数的结构体变量做函数的返回值,返回给主调函数的结构体变量做函数的返回值,返回
33、给主调函数的结构体变量做函数的返回值,返回给主调函数的是所有成员是所有成员是所有成员是所有成员结构体成员也可以做函数的参数和返回值,这与结构体成员也可以做函数的参数和返回值,这与结构体成员也可以做函数的参数和返回值,这与结构体成员也可以做函数的参数和返回值,这与普通变量做函数的参数和返回值是一样的。普通变量做函数的参数和返回值是一样的。普通变量做函数的参数和返回值是一样的。普通变量做函数的参数和返回值是一样的。41 例例例例7-67-6编写程序求解某一点在平面坐标中关于原点的对编写程序求解某一点在平面坐标中关于原点的对编写程序求解某一点在平面坐标中关于原点的对编写程序求解某一点在平面坐标中关于
34、原点的对称点。称点。称点。称点。42#include#include struct dot int nX;struct dot int nX;int nY;int nY;struct dot SymmetricalDot(struct dot sDot)/*struct dot SymmetricalDot(struct dot sDot)/*求对称点函数求对称点函数求对称点函数求对称点函数*/struct dot dSDot;/*struct dot dSDot;/*定义对称点结构体变量定义对称点结构体变量定义对称点结构体变量定义对称点结构体变量*/dSDot.nX=-sDot.nX;dSD
35、ot.nX=-sDot.nX;dSDot.nY=-sDot.nY;dSDot.nY=-sDot.nY;return dSDot;/*return dSDot;/*将对称点返回给主调函数将对称点返回给主调函数将对称点返回给主调函数将对称点返回给主调函数*/void main()void main()struct dot dPoint;struct dot dPoint;struct dot dSPoint;/*struct dot dSPoint;/*点点点点dPointdPoint的对称点的对称点的对称点的对称点*/printf(Please enter a Point:n);printf(P
36、lease enter a Point:n);scanf(%d,%d,&dPoint.nX,&dPoint.nY);scanf(%d,%d,&dPoint.nX,&dPoint.nY);dSPoint=SymmetricalDot(dPoint);/*dSPoint=SymmetricalDot(dPoint);/*调用求对称点函数调用求对称点函数调用求对称点函数调用求对称点函数*/printf(%d,%dn,dSPoint.nX,dSPoint.nY);printf(%d,%dn,dSPoint.nX,dSPoint.nY);437.1.6 位段位段想表达人的姓名、出生年、月、日,都定义什么
37、类型的成员变量?struct personchar name12;int year;int month;int day;这样有很多的空间浪费,比如month只可能取值1-12,4bits足够447.1.6 位段位段 在定义结构体时以位为单位来声明成员所占的内存长度,在定义结构体时以位为单位来声明成员所占的内存长度,在定义结构体时以位为单位来声明成员所占的内存长度,在定义结构体时以位为单位来声明成员所占的内存长度,这样的成员就称为位段或位域。这样的成员就称为位段或位域。这样的成员就称为位段或位域。这样的成员就称为位段或位域。C C语言允许声明位段为从语言允许声明位段为从语言允许声明位段为从语言允
38、许声明位段为从1 18 8范围内的任意位数。如,范围内的任意位数。如,范围内的任意位数。如,范围内的任意位数。如,struct bitdata struct bitdata unsigned a:2;unsigned a:2;unsigned b:5;unsigned b:5;unsigned c:3;unsigned c:3;unsigned d:2;unsigned d:2;bX;bX;现在大家要特别注意,位段a和b共7位,不满一个字节,还剩1位,但紧接其后的位段c却需要3位,这时系统会另外起一个存储单元来存放位段c,依据同样的规律第二个存储单元也会出现3位空闲,如下图所示。45 说明:说
39、明:说明:说明:(1)(1)(1)(1)位段成员的类型必须指定为位段成员的类型必须指定为位段成员的类型必须指定为位段成员的类型必须指定为unsigned unsigned unsigned unsigned 或或或或 intintintint类型。类型。类型。类型。(2)(2)(2)(2)一个位段必须存储在一个单元内一个位段必须存储在一个单元内一个位段必须存储在一个单元内一个位段必须存储在一个单元内(unsigned intunsigned intunsigned intunsigned int),不能跨单元。),不能跨单元。),不能跨单元。),不能跨单元。(3)(3)(3)(3)不能定义位段
40、数组。不能定义位段数组。不能定义位段数组。不能定义位段数组。467.1.6 位段位段 说明:说明:说明:说明:(4)(4)(4)(4)可以通过增加成员可以通过增加成员可以通过增加成员可以通过增加成员“unsigned:0;”unsigned:0;”unsigned:0;”unsigned:0;”,使某个位段从另一个,使某个位段从另一个,使某个位段从另一个,使某个位段从另一个unsigned intunsigned intunsigned intunsigned int开始存放。开始存放。开始存放。开始存放。struct bitdatastruct bitdatastruct bitdatast
41、ruct bitdata unsigned a:2;unsigned a:2;unsigned a:2;unsigned a:2;unsigned b:3;unsigned b:3;unsigned b:3;unsigned b:3;unsigned :0;unsigned :0;unsigned :0;unsigned :0;unsigned c:3;unsigned c:3;unsigned c:3;unsigned c:3;bX;bX;bX;bX;477.1.6 位段位段 说明:说明:说明:说明:(5)(5)(5)(5)可以为位段定义无名成员。可以为位段定义无名成员。可以为位段定义无名成
42、员。可以为位段定义无名成员。struct bitdatastruct bitdatastruct bitdatastruct bitdata unsigned a:2;unsigned a:2;unsigned a:2;unsigned a:2;unsigned b:3;unsigned b:3;unsigned b:3;unsigned b:3;unsigned :5;unsigned :5;unsigned :5;unsigned :5;unsigned c:3;unsigned c:3;unsigned c:3;unsigned c:3;bX;bX;bX;bX;*无名成员无名成员“uns
43、igned:5”表示表示5个二进制位空闲不用个二进制位空闲不用487.2 共用体共用体 共用体又称联合体,是将不同数据类型组合在共用体又称联合体,是将不同数据类型组合在共用体又称联合体,是将不同数据类型组合在共用体又称联合体,是将不同数据类型组合在一起,这些不同类型的成员在内存中所占用的起始一起,这些不同类型的成员在内存中所占用的起始一起,这些不同类型的成员在内存中所占用的起始一起,这些不同类型的成员在内存中所占用的起始单元是相同的。单元是相同的。单元是相同的。单元是相同的。共用体类型定义共用体类型定义 union 共用体名共用体名类型类型 成员成员1;类型类型 成员成员2;.类型类型n 成员
44、成员n;例如:例如:union unitint nClass;char cOffice10;共用体类型定义共用体类型定义union numbershort x;char ch;float y;基本上和基本上和struct一样一样x、ch和和y处于同样的地址处于同样的地址sizeof(union xxx)取决于占空间最多的那个成员变取决于占空间最多的那个成员变量量1000H4950共用体变量定义共用体变量定义 共用体变量的声明和结构变量的定义方式一样,共用体变量的声明和结构变量的定义方式一样,共用体变量的声明和结构变量的定义方式一样,共用体变量的声明和结构变量的定义方式一样,也有三种。也有三种。
45、也有三种。也有三种。union unit int nClass;char cOffice10;union unit uDepart;union unit int nClass;char cOffice10;uDepart;union int nClass;char cOffice10;uDepart;共用体变量的赋值和引用共用体变量的赋值和引用 共用体变量名共用体变量名.成员名成员名51例:例:union number int x;float y;s1,s2;变量变量s1的存储空间为:的存储空间为:S1.yS1.yS1.xS1.x52同一段内存允许有多种类型的成员,某一时刻仅同一段内存允许有多
46、种类型的成员,某一时刻仅 一个成员起作用。一个成员起作用。共用体使用覆盖技术,起作用的是最后一次存放共用体使用覆盖技术,起作用的是最后一次存放的成员。的成员。如:如:s1.x=1;s1.y=3.5;s1.y有效有效在定义共用体变量时,不能对它进行初始化。在定义共用体变量时,不能对它进行初始化。两个共用体变量不能进行比较操作两个共用体变量不能进行比较操作对共用体变量的有关说明对共用体变量的有关说明53与结构体的异同:与结构体的异同:相同之处:类型说明形式、变量定义相同之处:类型说明形式、变量定义方式与结构体相同。方式与结构体相同。不同之处:结构体变量中各成员有独不同之处:结构体变量中各成员有独立
47、的存立的存 储空间。储空间。54共用体的特点共用体的特点同一内存单元在每一瞬时只能存放其中一种类同一内存单元在每一瞬时只能存放其中一种类型的成员;并非同时都起作用型的成员;并非同时都起作用起作用的成员是最后一次存放的成员起作用的成员是最后一次存放的成员不能作为函数参数和函数返回值类型不能作为函数参数和函数返回值类型55姓名姓名name性别性别sex年龄年龄age婚姻状况婚姻状况婚姻状况婚姻状况标记标记未婚未婚 已婚已婚离婚离婚配配偶偶子子女女年年 月月日日structstruct personperson charchar name20;name20;charchar sex;sex;inti
48、nt age;age;unionunion intint single;single;structstruct charchar spouseName20;spouseName20;intint child;child;married;married;structstruct date divorcedDay;date divorcedDay;marital;marital;intint marryFlag;marryFlag;共用体的应用共用体的应用共用体的应用共用体的应用56#include#define NUM 2struct infochar cName10;int nAge;char
49、 cJob;union unit/*共用体共用体*/int nClass;char cOffice10;uDepa;iPersonInfoNUM;57void main()int i;for(i=0;iNUM;i+)printf(input Name,Age,Job and Class/Officen);scanf(%s%d%c,iPersonInfoi.cName,&iPersonInfoi.nAge,&iPersonInfoi.cJob);if(iPersonInfoi.cJob=s)scanf(%d,&iPersonInfoi.uDepa.nClass);else scanf(%s,iP
50、ersonInfoi.uDepa.cOffice);58 printf(NametAgetJobtClass/Officen);for(i=0;ix=0;/*指向运算符*/l第二种更常用xypptpt60上次课我们学到了上次课我们学到了l结构体变量既可以做函数的参数也可以做函数的返回值。l结构体变量作函数参数和返回值传递的是所有成员。l结构体成员也可以做函数的参数和返回值,这与普通变量做函数的参数和返回值是一样的。61上次课我们学到了上次课我们学到了l位段struct bitdata unsigned a:2;unsigned b:5;unsigned c:3;unsigned d:2;bX;