第10章-结构体与共用体课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第10章-结构体与共用体课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 结构 共用 课件
- 资源描述:
-
1、内容回顾内容回顾基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型数组数组结构体结构体共用体共用体数据类型数据类型上述数据类上述数据类型名不符合型名不符合书写习惯书写习惯怎么办?怎么办?存放存放相同类型相同类型的数据的数据C程序要求每程序要求每个变量都要有个变量都要有自己的自己的数据类数据类型型。但是但是一组类型不一组类型不同的数据,同的数据,怎么办?怎么办?自定义类型标识符自定义类型标识符结构体的定义与引用结构体的定义与引用共用体的定义与引用共用体的定义与引用10.1 自定义类型标识符自定义类型标识符 C 语言可以通过语言可以通过 typedef 语句,定义自己的数据类型。实语句,
2、定义自己的数据类型。实际上是给际上是给 C 现有类型重新起个名字,即自定义类型标识符。现有类型重新起个名字,即自定义类型标识符。typedef语句的格式:语句的格式:typedef 现有类型现有类型名名 新类型名新类型名;C语言的类型符语言的类型符用户定义的类型符用户定义的类型符基本类型基本类型 typedef int INTEGER;typedef float REAL;数组数组 typedef int ARRAY100;typedef char*POINTER;int i;float x;INTEGER i;REAL x;就可以写成就可以写成int a100,b100;char*pa,*p
3、b;ARRAY a,b;POINTER pa,pb;就可以写成就可以写成1、先按定义变量的方法写出定义语句、先按定义变量的方法写出定义语句;如如:int a10;2、将变量名用新类型名替换;将变量名用新类型名替换;如如:int ARRAY10;3、再在最前面加、再在最前面加typedef;如如:typedef int ARRAY10;4、然后就可以用新类型名定义变量。然后就可以用新类型名定义变量。如如:ARRAY a,b,c;用用typedef定义新类型的步骤定义新类型的步骤注意:注意:typedeftypedef 并不创建新的类型并不创建新的类型 结构体导入结构体导入 一组相同类型的数据我们
4、可以用数组来处理,但是在实际应用一组相同类型的数据我们可以用数组来处理,但是在实际应用中,经常有一些既有联系,类型又不同的数据需要一起处理。中,经常有一些既有联系,类型又不同的数据需要一起处理。如:学生的基本信息如:学生的基本信息 字段:字段:学号学号 姓名姓名 性别性别 地址地址 成绩成绩类型:类型:long char long char charchar charchar float float C C语言允许用户按语言允许用户按自己的需要将不同的基本类型构造成一自己的需要将不同的基本类型构造成一种特殊类型种特殊类型,即,即结构体结构体。结构体的操作分为结构体的操作分为4 4步:步:根据需
5、要根据需要先定义结构体类型先定义结构体类型;然后通过定义的类型然后通过定义的类型定义结构体变量定义结构体变量(数组、指针数组、指针);结构体变量结构体变量(数组、指针数组、指针)赋值赋值(址);(址);引用结构体变量引用结构体变量(数组、指针数组、指针)。11.2 结结 构构 体体格式:格式:struct 结构名结构名 数据类型数据类型 成员成员1;数据类型数据类型 成员成员2;数据类型数据类型 成员成员n;;结构体标志。结构体标志。用标识符命名的结构类型名。用标识符命名的结构类型名。结构类型中所含的结构类型中所含的成员及其类型。成员及其类型。struct student long num;/
6、*学号学号*/char name20;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/float score;/*成绩成绩*/;如:日期结构体类型如:日期结构体类型struct date int month;int day;int year;或或:struct date int month,day,year;此处分号不能省略此处分号不能省略;结构体的内存结构结构体的内存结构long num;char name20;char sex;int age;float score;20B1B4B4B4B 为了加快为了加快cpu的存取速度,的存取速度,VC+编译器在处理数
7、据时经常把编译器在处理数据时经常把结构体成员的大小按照结构体成员的大小按照4或或8的倍数计算,此即数据对齐。基本的倍数计算,此即数据对齐。基本的原则:按成员类型大小从小到大声明。的原则:按成员类型大小从小到大声明。经上面定义之后:经上面定义之后:struct student 和和int ,float 等标准类型标识符一样可用来等标准类型标识符一样可用来定义变量、数组、指针变量等定义变量、数组、指针变量等如:如:学生基本情况学生基本情况 struct student long num;char name20;char sex;int age;struct date birthday;float
8、score;;struct student long num;char name10;char sex;int age;struct date int year;int month;int day;birthday;float score;;结构体嵌套:结构体嵌套:一个结构体成员可以又是一个结构体变量。定义结构只是确定该定义结构只是确定该结构体类型的名称结构体类型的名称、成员成员及及成员的类成员的类型型。必须通过结构体类型定义变量,才能赋值并使用。必须通过结构体类型定义变量,才能赋值并使用。结构体变量的结构体变量的4种定义方式:种定义方式:先定义结构体类型,再定义结构体变量。先定义结构体类型,
9、再定义结构体变量。struct student long num;char name20;int age;char add30;float score;struct student std1,*pst,pers3;用用struct student 类类型说明型说明3个变量。个变量。定义结构类型的同时定义结构体变量。定义结构类型的同时定义结构体变量。struct student long num;char name20;char sex;int age;float score;std1,*pst,pers3;直接定义结构体变量。直接定义结构体变量。struct long num;char nam
10、e20;char sex;int age;float score;std,*pstd,pers3;说明:说明:无结构体名。无结构体名。注意类型和变量的区别。注意类型和变量的区别。成员可单独使用。成员可单独使用。如:如:用用typedeftypedef将结构体类型定义新类型,再定义变量。将结构体类型定义新类型,再定义变量。typedef struct student long num;char name20;char sex;int age;float score;STREC;此处分号不能省略此处分号不能省略STREC std,*pstd,pers3;定义变量定义变量定义新类型定义新类型1、结构
11、体变量的初始化、结构体变量的初始化结构体变量名结构体变量名=初值初值;注意:注意:初值的个数、顺序、类型应与成员说明一致初值的个数、顺序、类型应与成员说明一致结构变量结构变量(数组、指针数组、指针)可以在说明时赋初值,称为初始化。可以在说明时赋初值,称为初始化。格式:格式:structstruct student std=20001 student std=20001,Li Li LiLi,MM,1919,8585;2、结构体数组的初始化、结构体数组的初始化struct 结构体名结构体名 *结构体数组名结构体数组名=初始数据初始数据;struct student pers3=20001,Sun
12、 Lin,M,19,85,20002,Li Si,W,19,85,20003,John,M,19,85;格式:格式:前面前面4种定义形式均可在定义时对结构体进行初始化。种定义形式均可在定义时对结构体进行初始化。多项数据多项数据之间用逗之间用逗号隔开。号隔开。结构体数组相当于一个广义的二维数组,结构体数组的初始化与二维数组的初始化类似。3、结构体指针的初始化、结构体指针的初始化struct 结构体名结构体名 *结构体指针变量名结构体指针变量名=&同类结构体变量名同类结构体变量名 struct student std,*sp=&std;格式格式1 1:struct 结构体名结构体名 *结构体指针变
13、量名结构体指针变量名=同类结构体数组名同类结构体数组名 格式格式2 2:struct student pers3,sp=pers;#include stdio.hmain()struct student long num;char name20;char*sex;int age;char addr30;wang=200989001,“王五王五,女女,20,上海上海;printf(num=%ld,name=%s,sex=%s,age=%d,addr=%s n,wang.num,wang.name,wang.sex,wang.age,wang.addr);方式方式1:结构体变量名结构体变量名.成员
14、名成员名方式方式2:(*指针变量名指针变量名).成员名成员名方式方式3:指针变量名指针变量名-成员名成员名1、结构体成员的引用(、结构体成员的引用(3种方式)种方式)若有:若有:struct student std,pers3,*sp=&std;则;则 std.num=10101;等价于等价于 sp-num=10101;std.sex=M;等价于等价于 (*sp).sex=M;std.score=75+8;等价于等价于 (*sp).score=75+8;std.age+;等价于等价于 sp-age+;.成员引用运算符成员引用运算符-指向成员运算符指向成员运算符(1)对于)对于结构体类型数组结构
15、体类型数组,要遵循,要遵循数组元素数组元素的引用原则的引用原则(或或*)和)和结构体成员结构体成员的引用原则(的引用原则(.或或-)。)。pers2.agepers2.age或或(pers+2)-age(pers+2)-age或或(*(pers+2).age(pers+2).agepers.agestd.name2std.name2或或sp-name2sp-name2或(或(*spsp).name2.name2std.name如:如:pers数组的第数组的第2个元素的成员个元素的成员age如:成员如:成员name数组的第数组的第2个元素个元素(2)对于结构体嵌套,只能引用最低层的成员。)对于结
16、构体嵌套,只能引用最低层的成员。struct student long num;char name10;char sex;int age;struct date int year;int month;int day;birthday;float score;std;如如:引用结构体变量引用结构体变量std中的出生月份中的出生月份std.birthday.monthstd.birthday.monthspsp-birthday.monthbirthday.month(*sp).birthday.monthsp).birthday.month注意:注意:由外向内逐层引用,由外向内逐层引用,每层之间
17、用点号每层之间用点号“.”分隔。分隔。(3 3)可以)可以对变量、数组元素及其成员进行对变量、数组元素及其成员进行取地址运算取地址运算取结构体变量的地址为:取结构体变量的地址为:&结构体变量名结构体变量名 如:如:&std&std取结构体成员的地址为:取结构体成员的地址为:&结构体变量名结构体变量名.成员成员 如:如:&std.agestd.age(4 4)成员运算符)成员运算符“.”.”和指向运算符和指向运算符“-”-”的优先级最高,结的优先级最高,结合性自右向左。合性自右向左。+sp-num+sp-num等价于等价于+(sp-num)+(sp-num)sp-num+sp-num+等价于等价
18、于(sp-num)+(sp-num)+即即成员成员numnum的值自增的值自增(+sp)-num sp(+sp)-num sp指向下一个元素,再取出该元素成员指向下一个元素,再取出该元素成员numnum的值的值 (sp+)-num (sp+)-num 先取出先取出spsp所指元素成员所指元素成员numnum的值,再指向下一个的值,再指向下一个元素。元素。(5 5)成员运算符的成员运算符的优先级优先级高于地址运算符高于地址运算符(*sp).namesp).name 不同于不同于*sp.namesp.name、*sp-namesp-name若有若有structstruct student std=
19、20001,John,M,19,85,student std=20001,John,M,19,85,*sp=&std;sp=&std;则则*(*sp).namesp).name)值为值为John John 而而*sp.namesp.name 错误错误但但*sp-namesp-name值为值为cc(6 6)结构体指针只能指向)结构体指针只能指向同类结构体同类结构体,不能指向结构体成员,不能指向结构体成员若有若有STREC std,*pstd,pers3;则则sp=&pers2.num 错误错误#include stdio.hmain()struct studentlong num;char na
20、me20;char sex;float score;s1=20001,Li Li,M,85;struct student s2;float sum,ave;scanf(%ld%s%c%f,&s2.num,s2.name,&s2.sex,&s2.score);sum=s1.score+s2.score;ave=sum/2;printf(NOtNAMEtSEXtSCOREn);printf(%ldt%st%ct%5.1fn,s1.num,s1.name,s1.sex,s1.score);printf(%ldt%st%ct%5.1fn,s2.num,s2.name,s2.sex,s2.score);
21、printf(sum=%5.1ftave=%5.1fn,sum,ave);定义结构体定义结构体student,并初始化变量并初始化变量s1即第即第1个学生信息。个学生信息。定义变量定义变量s2、sum、ave【例【例10.1】结构体类型变量的引用示例:结构体类型变量的引用示例:求两个学生总成绩及平均成绩求两个学生总成绩及平均成绩输入第输入第2个学生信息个学生信息计算这两个学生的总成绩、平均成绩计算这两个学生的总成绩、平均成绩输出标题信息输出标题信息输出这两个输出这两个学生信息学生信息输出其总成绩、平均成绩输出其总成绩、平均成绩例例10.110.1(源代码源代码)#include stdio.h
22、#define N 10main()struct student int num;float score;studN;float ave=0,max;int i,k=0;printf(input:num,name,score);for(i=0;iN;i+)scanf(%ld,%f,&studi.num,&studi.score);ave=ave+studi.score;ave=ave/N;max=stud0.score;for(i=1;iN;i+)if(maxnum);printf(%st%st%sn,stu1.name,(*sp).name,sp-name);printf(%5.2ft%5.
23、2ft%5.2fn,stu1.score,(*sp).score,sp-score);【例【例10.3】结构体指针变量的应用:结构体指针变量的应用:求求N N个学生最高分及平均成绩个学生最高分及平均成绩例例10.310.3(源代码源代码)勘误:勘误:P235 sp前加星号前加星号#include stdio.hstruct studentlong num;char name20;float score;struct student stu3=20001,Li Li,85,20002,Wu an,78,20003,Ma Lin,69;main()struct student *p;printf(
24、学号t姓名t成绩n);for(p=stu;pnum,p-name,p-score);【例【例10.4】结构体指针变量的应用:结构体指针变量的应用:求求N N个学生最高分及平均成绩个学生最高分及平均成绩例例10.410.4(源代码源代码)学号姓名成绩20001Li Li85.00000020002Wu an78.00000020003Ma Lin69.000000输出结果:输出结果:2.对结构体类型变量的整体赋值对结构体类型变量的整体赋值同种类型同种类型的结构体变量之间可以进行的结构体变量之间可以进行整体赋值整体赋值操作。操作。例如:struct studentlong num;char nam
25、e20:char sex;int age;float score;std1,std2=11011,Yang Lin,M,18,89;std1=std2;实际上是将std2的成员分别赋给std1中对应的同名成员。3 3种传递方式:种传递方式:l 用结构体变量的用结构体变量的成员成员作参数作参数 结构体变量的成员可以看做普通变量。l 用指向结构体的指针作参数用指向结构体的指针作参数 结构体变量的整体双向传递,形参的改变会影响到实参。l用结构体变量的整体作参数用结构体变量的整体作参数 结构体变量的整体单向传递,形参的改变不会影响到实参。例题例题10.5例题例题10.6例题例题10.7传递整体传递整体
展开阅读全文