书签 分享 收藏 举报 版权申诉 / 49
上传文档赚钱

类型第10章-结构体与共用体课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3183279
  • 上传时间:2022-07-30
  • 格式:PPT
  • 页数:49
  • 大小:1.09MB
  • 【下载声明】
    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传递整体传递整体

    26、传递成员传递成员 链表作为一种常用的、能够实现动态存储分配的数据结链表作为一种常用的、能够实现动态存储分配的数据结构,是构,是二级公共基础的数据结构二级公共基础的数据结构部分的要点之一。部分的要点之一。链即用指针连接数据结点。本节重点讲述单链表,其模链即用指针连接数据结点。本节重点讲述单链表,其模型如下:型如下:a1anhead(1)头指针)头指针head指向链表的首结点。指向链表的首结点。(2)每个结点由)每个结点由2个域组成:个域组成:数据域数据域存储结点本身的信息。存储结点本身的信息。指针域指针域指向后继结点的指针。指向后继结点的指针。(3)尾结点的指针域置空()尾结点的指针域置空(NU

    27、LL),作为链表结束的标志),作为链表结束的标志1链表概述链表概述a1a2anhead语言对链表结点的结构描述语言对链表结点的结构描述 在语言中,用结构类型来描述结点结构。例如:在语言中,用结构类型来描述结点结构。例如:struct slist int data;/*数据域数据域*/struct slist *next;/*指针域指针域*/;typedef struct slist SLIST;用于动态分配空间的用于动态分配空间的3个标准函数(个标准函数(stdlib.h)l malloc(size);在内存的动态区申请在内存的动态区申请1个长度为个长度为size的存储单元的存储单元l cal

    28、loc(n,size);在内存的动态区申请在内存的动态区申请n个长度为个长度为size的存储单元的存储单元l free(*ptr);释放由释放由ptr指向的存储单元指向的存储单元2.链表的建立链表的建立例例10.8 编写一个编写一个creat()函数用于建立一个有函数用于建立一个有5名学生基本数名学生基本数据的单向链表。据的单向链表。其算法步骤为:其算法步骤为:(1)定义一个描述学生基本数据的结构体类型。定义一个描述学生基本数据的结构体类型。(2)定义三个指向结构体的指针定义三个指向结构体的指针p,q和和head。其中。其中head为为头指针;头指针;p为当前结点的指针;为当前结点的指针;q为

    29、当前链表的表尾结点为当前链表的表尾结点指针。指针。(3)建立第一个结点建立第一个结点(4)建立其它节点并完成与当前链表的链接。建立其它节点并完成与当前链表的链接。重复步骤(重复步骤(4)就可以完成链表的建立。)就可以完成链表的建立。#define N 5#define LEN sizeof(STUD)struct studentint num;float score;struct student*next;typedef struct student STUD;/*第(1)步*/STUD *creat()STUD *head,*p,*q;/*第(2)步*/int i;p=(STUD*)mall

    30、oc(LEN);scanf(%d,%f,&p-num,&p-score);p-next=NULL;head=p;q=p;/*第(3)步*/for(i=1;inext=NULL;scanf(%d,%f,&p-num,&p-score);q-next=p;q=p;/*第(4)步*/return(head);3.链表的输出链表的输出例例10.9 编写输出链表的函数编写输出链表的函数print()通过单链表的头指针,首先找到链表的第一个结点;然后顺通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域将搜索到的每个节点的数据域的值输出着结点的指针域将搜索到的每个节点的数据域的值输出void

    31、 print(STUD*head)STUD*p;p=head;while(p!=NULL)printf(%d,%fn,p-num,p-score);p=p-next;/*指针移向下一个结点指针移向下一个结点*/4.链表的删除链表的删除例例10.10 编写函数编写函数delete()实现链表的删除操作实现链表的删除操作基本思路:基本思路:通过单链表的头指针,首先找到链表的第一个结点;通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为然后顺着结点的指针域找到学号为num的结点,修改其前的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。一个节点的指针域的值,使他

    32、指向他的下一个结点。q-next=p-next;q-next=p-next;free(pfree(p););STUD *delete(STUD*head,int num)STUD*p,*q;if(head=NULL)printf(list null!);!);return(0);p=head;while(num!=p-num&p-next!=NULL)*p指向的不是要找的结点,并且后面还有结点指向的不是要找的结点,并且后面还有结点*q=p;p=p-next;*向后移一个结点向后移一个结点*if(num=p-num)*找到了待删结点找到了待删结点*if(p=head)head=p-next;*待

    33、删的是第一个结点待删的是第一个结点*else q-next=p-next;*待删的不是第一个结点待删的不是第一个结点*printf(delete :%dn,p-num);free(p);else *没有找到待删结点没有找到待删结点*printf(%ld not been found!n,num);return(head);5.链表的插入链表的插入例例10.11 编写插入结点的函数编写插入结点的函数insert(),实现在有序链表中,实现在有序链表中结点的插入操作(假设链表按照结点的插入操作(假设链表按照num(学号)从小到大顺(学号)从小到大顺序排列)。序排列)。基本思路:基本思路:通过单链表

    34、的头指针,首先找到链表的第通过单链表的头指针,首先找到链表的第1个结点;然个结点;然后顺着结点的指针域找到值为后顺着结点的指针域找到值为x的节点,然后将新结点的节点,然后将新结点y插插入。入。q-next=p;q-next=p;r-next=q;r-next=q;STUD*insert(STUD*head,STUD*stud)STUD*p,*q,*p0;p=head;/*设置扫描指针设置扫描指针p*/p0=stud;*p0指向要插入的结点指向要插入的结点*if(head=NULL)*原来是空表原来是空表*head=p0;p0-next=NULL;else while(p0-nump-num)&

    35、(p-next!=NULL)q=p;pp-next;if(p0-numnum)if(head=p)headp0;*插到原来第一个结点之前插到原来第一个结点之前*else q-next=p0;*插到插到q指向的结点之后指向的结点之后*p0-next=p;else p-next=p0;p0-next=NULL;*插到最后的结点之后插到最后的结点之后*return(head););例例10.12 编写主函数调用以上各函数编写主函数调用以上各函数STUD *creat();void print(STUD*head);STUD *delete(STUD*head,int num);STUD*insert

    36、(STUD*head,STUD*stud);main()STUD*head,*stu;int del_num;printf(input records :n);head=creat();*建立单链表,返回头指针建立单链表,返回头指针*print(head);*输出链表中全部结点数据域的值输出链表中全部结点数据域的值*printf(input the deleted number:);scanf(%d,&del_num);*输入要删除的学号输入要删除的学号*while(del_num!=0)head=delete(head,del_num);*返回删除结点后链表的头指针返回删除结点后链表的头指针

    37、*print(head);printf(input the deleted number:);scanf(%d,&del_num);*输入要删除的学号输入要删除的学号*printf(input the inserted record:n);stu=(STUD*)malloc(LEN);scanf(%d,%f,&stu-num,&stu-score);*输人要插入的记录输人要插入的记录*while(stu-num!=0)head=insert(head,stu);*返回插入新结点后的链表头指针返回插入新结点后的链表头指针*print(head););printf(input the insert

    38、ed record:n);stu=(STUD*)malloc(LEN);scanf(%d,%f,&stu-num,&stu-score);*输人要插入的记录输人要插入的记录*共用体是指不同类型的数据可以在不同的时间内使用共共用体是指不同类型的数据可以在不同的时间内使用共同的内存单元。尽管这些在内存中占的字节数不同,但都从同的内存单元。尽管这些在内存中占的字节数不同,但都从同一起始地址开始存放。而且是在不同的时间内去使用该内同一起始地址开始存放。而且是在不同的时间内去使用该内存单元。存单元。共用体实际上是共用体实际上是C语言提供的一种覆盖技术。语言提供的一种覆盖技术。10.3 共共 用用 体体

    39、char sexshort num float score 共用体的定义、使用形式同结构体相似。共用体的定义、使用形式同结构体相似。union 共用体名共用体名 类型名类型名1 共用体成员名表共用体成员名表1;类型名类型名2 共用体成员名表共用体成员名表2;类型名类型名n 共用体成员名表共用体成员名表n;;1.共用体类型的定义共用体类型的定义 union student int num;char sex;float score;union student stu1,stu2;typedef union int num;char sex;float score;UN;UN s1,s2;union

    40、 int num;char sex;float score;stu1,stu2;union student int num;char sex;float score;stu1,stu2;2.共用体变量的定义共用体变量的定义3.共用体变量的引用方式共用体变量的引用方式共用体的使用也与结构体相同,用共用体的使用也与结构体相同,用&取共用体的地址,取共用体的地址,用用“.”或或“-”访问共用体成员。例如:访问共用体成员。例如:stu1.num(引用共用体变量中的整型变量引用共用体变量中的整型变量num)stu1.sex (引用共用体变量中的字符变量(引用共用体变量中的字符变量sex)stu1.sco

    41、re(引用共用体变量中的实型变量引用共用体变量中的实型变量score)1、同一个内存段可以用来存放几种不同类型的成员,但在、同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种。每一瞬时只能存放其中一种。2、共用体变量中起作用的成员是最后一次存放的成员,在、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。如有以下赋值存入一个新的成员后原有的成员就失去作用。如有以下赋值语句:语句:stu1.num=101;stu1.sex=F;stu1.score=89.5;在完成以上三个赋值运算以后,只有在完成以上三个赋值运算以后,只有stu1.sc

    42、ore是有效的,是有效的,stu1.num和和stu1.sex已经无意义了。已经无意义了。共共 用用 体体 使使 用用 说说 明明3、共用体变量的地址和它的各成员的地址都是同一地址、共用体变量的地址和它的各成员的地址都是同一地址4、不能对共用体变量名赋值,也不能企图引用变量名来得到成、不能对共用体变量名赋值,也不能企图引用变量名来得到成员的值,也不能在定义共用体变量时对它初始化。员的值,也不能在定义共用体变量时对它初始化。5、不能把共用体变量作为函数参数,也不能使函数带回共用体、不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针(与结构体变量这种变量,但可

    43、以使用指向共用体变量的指针(与结构体变量这种用法相仿)。用法相仿)。6、共用体类型可以出现在结构体类型定义中,也可以定义共用、共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。也可以作为共用体的成员。例如例如:struct date int day;int month;int year;union int sh1;float sh2;sh;a;举举 例例例例 10.13 分析下列程序的运行结果分析下列程序的运行结果 main()union char c2;int

    44、 k;r;r.c0=2;r.c1=0;r.k=20;printf(%d,%d,%dn,r.k,r.c0,r.c1);20,20,0【例例10.14】分析下列程序的输出结果分析下列程序的输出结果 union as int a;int b;s3,*p;main()int n=1,k;for(k=0;ka,+p-a);3,3+p-a,p-a);3,2+p-a,+p-a);4,3共用体共用体与结构体的区别与结构体的区别struct exam int a;float b;char c;x;xabcunion exam int a;float b;char c;x;xb ac 结构变量的每个成员有独立的内

    45、存单元,结构变量的每个成员有独立的内存单元,而共用体变量的成员而共用体变量的成员以最大的成员开辟单元以最大的成员开辟单元后,所有成员共用该单元。后,所有成员共用该单元。sizeof(struct exam)10.4 枚枚 举举 类类 型型枚举类型的枚举类型的定义定义格式格式:enum 枚举类型标识符 枚举元素表列;例如:例如:enum daysun,mon,tue,wed,thu,fri,sat;以上定义了一个枚举类型enum day,有个枚举元素。可以用此类型来定义变量。enum day workday;workday被定义为枚举变量,它的值只能是sun到sat之一。可以用通常给变量赋值的方

    46、法给枚举变量赋值。例如:workday=mon;当然,也可以直接定义枚举变量,如:enum sun,mon,tue,wed,thu,fri,satworkday;说说 明明(1)对枚举类型的定义和枚举变量的使用,其实质是C编译系统将枚举元素按次序用0,1,等整数来代替,故称枚举元素为枚举常量,它们不是变量,所以不能被赋值。例如:printf(%1d,%1d,%1dn,sun,mon,tue);屏幕将显示为:0,1,2,(2)枚举值可以用来作判断比较。如:if(workday=mon)枚举值的比较规则是:按其在定义时的顺序号比较。(3)虽然每个枚举元素有一个对应的整数值,但是不能将一个整数直接赋

    47、给一个枚举变量。如:workday=2;是不对的。它们属于不同的类型。但可以通过强制类型转换后进行赋值。如:workday=(enum weekday)2;它的含义是将顺序号为2的枚举元素赋给workday,则相当于:workday=tue;【例例8.15】分析下列程序的运行结果。分析下列程序的运行结果。main()main()enumenum daysundaysun,monmon,tuetue,wedwed,thuthu,frifri,satsat;/*定义枚举类型定义枚举类型 */enumenum day today day today;/*定义枚举类型变量定义枚举类型变量today t

    48、oday*/intint n n;printfprintf(input todays number(0-6):input todays number(0-6):);scanfscanf(%d%d,&n)&n);switch(nswitch(n)case 0:today=sun case 0:today=sun;breakbreak;case 1:today=case 1:today=monmon;breakbreak;case 2:today=case 2:today=tuetue;breakbreak;case 3:today=wedcase 3:today=wed;breakbreak;c

    49、ase 4:today=case 4:today=thuthu;breakbreak;case 5:today=case 5:today=frifri;breakbreak;case 6:today=satcase 6:today=sat;breakbreak;/*给枚举变量给枚举变量todaytoday赋值赋值 */printfprintf(Today is Today is);switch(todayswitch(today)case case sun:printfsun:printf(SundaynSundayn);breakbreak;case case mon:printfmon:p

    50、rintf(MondaynMondayn);breakbreak;case case tue:printftue:printf(TuesdaynTuesdayn);breakbreak;case case wed:printfwed:printf(WendesdaynWendesdayn);breakbreak;case case thu:printfthu:printf(ThursdaynThursdayn);breakbreak;case case fri:printffri:printf(FridaynFridayn);breakbreak;case case sat:printfsat

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第10章-结构体与共用体课件.ppt
    链接地址:https://www.163wenku.com/p-3183279.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库