第8章结构体与共用体_第1页
第8章结构体与共用体_第2页
第8章结构体与共用体_第3页
第8章结构体与共用体_第4页
第8章结构体与共用体_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,主要内容:结构体的定义和使用结构体数组指向结构体的指针共用体枚举使用关键字typedef,第八章:结构体、共用体和枚举类型,C语言提供了几种确立组合数据类型的途径:,结构:一种在同一名字下的各种变量的组合。位域:一种结构的变体,允许访问一个字节的各个位。联合:一种使不同类型的变量公用同一内存块的组合。枚举:一种整型常量的集合。typedef:它定义一个新的名称代替某种数据类型。,8.1结构体的定义与使用,说到结构数据类型,让我们来看一种数据组合的例子:,8.1结构体的定义与使用,对于上例中的数据结构,可以用一种叫做结构体的构造数据类型来表示它:,structemployeecharid7;/*职工号*/charname50;/*姓名*/charsex3;/*性别*/charbirthday11;/*出生日期*/chardegree50;/*学历*/;,定义的结构类型名,此结构类型包含的成员,8.1结构体的定义与使用,对于上例中的数据结构,可以用一种叫做结构体的构造数据类型来表示它:,structemployeecharid7;charname50;charsex3;structdate/*内部又包含了一*/intyear;/*个结构,我们给*/intmonth;/*给它起名叫date*/intday;birthday;/*用date定义了一个变量birthday*/chardegree50;,8.1结构体的定义与使用,structemployeei;strcpy(i.id,20000101);i.birthday.year=1979;i.birthday.month=7;i.birthday.day=23;printf(%sn,i.id);printf(%4d-%2d-%2d,i.birthday.year,i.birthday.month,i.birthday.day);,对于上例中的数据类型,我们来举例看一看它是如何工作的:,用这种结构体类型定义的变量,已定义的结构类型,如同int一样,是一种数据类型,8.1结构体的定义与使用,请大家看下面的数据结构,尝试着写出相应的结构类型,并比较一下这种数据类型和数组的区别:,8.1结构体的定义与使用,写出来大概是下面这样的形式:,structscorecharname50;/*姓名*/unsignedenglish;/*大学英语*/unsignedmath;/*高等数学*/unsignedc_program;/*C语言*/unsignedsum;,结构体的各成员和数组的各元素一样,都是连续存放在一块内存空间中的;但数组的各元素必须类型一致,而结构的各成员可以具有不同的数据类型。,8.1结构体的定义与使用,结构定义和结构变量定义的方法大概有下列三种:,先定义结构类型,再定义相应结构变量;定义结构类型的同时定义相应结构变量;不定义结构类型,直接定义相应结构变量。,8.1结构体的定义与使用,先定义结构类型,再定义相应结构变量。如:,structemployeecharid7;charname50;structemployeei;,9.1结构体的定义与使用,定义结构类型的同时定义相应结构变量。如:,structemployeecharid7;charname50;i;,9.1结构体的定义与使用,不定义结构类型,直接定义相应结构变量。如:,structcharid7;charname50;i;,如果省略结构名,则称之为无名结构,这种情况常常出现在结构体嵌套定义内部。,9.1结构体的定义与使用,定义结构体变量时也可以对它进行初始化,如:,structemployeecharid7;charname50;charsex3;structintyear;intmonth;intday;birthday;singer=“001”,“JohnLennon”,M,1940,10,9;,8.1结构体的定义与使用,结构体变量的初始化,引用结构体变量中的每个成员,通过“.”(成员运算符,或叫句点运算符)来引用。,结构成员的表示方式为:结构变量.成员名,如果将“结构变量.成员名”看成一个整体,则这个整体的数据类型就是结构中该成员的数据类型,这样就可象使用简单变量那样来使用它。,9.1结构体的定义与使用,整体引用结构体变量,整体引用结构本变量主要应用在同一类型结构体变量之间的整体赋值。,我们知道,数组是不能整体赋值的,比如:inta3,b3=1,2,3;a=b;,a=1,2,3;,但同一类型的结构体变量之间可以整体赋值,如:structstudentstu1,stu2=1,“gel”,m,30;stu1=stu2;,9.1结构体的定义与使用,整体引用结构体变量主要应用在同一类型结构体变量之间的整体赋值。,但同一类型的结构体变量之间可以整体赋值,如:structstudentstu1,stu2=1,“gel”,m,30;stu1=stu2;,可以将一个数组作为结构体的成员,这种情况下就可以给这个数组整体赋值了。,整体引用结构体变量,8.1结构体的定义与使用,整体引用结构本变量时要注意:,不能整体输入或输出:这一点和数组是相同的。,不能用常量整体赋值:stu1=1,“gel”,m,30;,结构体变量的地址也是它的第一个成员的地址。,多级成员用多级方式来引用:i.birthday.year;,结构体的长度有可能不是其成员长度的总和:可以用sizeof来求其实际长度,如sizeof(stu1),或sizeof(structstudent)。,8.1结构体的定义与使用,整体引用结构体变量,我们已经看到了如下的员工记录:,如果共有50名员工,如何来处理这些记录呢?,8.2结构体数组,我们可以定义一个有50个元素的结构体变量数组:,structemployeecharid7;charname50;charsex3;structdateintyear;intmonth;intday;birthday;chardegree50;emp50;,emp是一个数组,而它的每个元素,比如emp0、emp1,都是一个单独的结构体变量。,8.2结构体数组,它们在内存中的存储结构如下图:,emp0,emp1,emp2,emp3,emp4,emp5,emp6,emp7,8.2结构体数组,结构指针是指向结构体的指针。它由一个加在结构变量名前的“*”操作符来定义。,例如用前面已说明的结构定义一个结构指针如下:structstudentintnum;charname20;charsex;floatscore;*s;,8.3指向结构体的指针,结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。,结构指针对结构成员的访问表示为:,结构指针名-结构成员,其中指向成员运算符(又叫箭头运算符)“-”是两个符号-和的组合,好象一个箭头指向结构成员。,8.3指向结构体的指针,structstudentintnum;charname20;charsex;floatscore;*s;,strcpy(s-name,“John”);s-score=98;,结构指针对结构成员的访问表示为:,结构指针名-结构成员,例如要给左边定义的结构中name和score赋值,可以用下面语句:,实际上,s-name就是(*s).name的缩写形式。,8.3指向结构体的指针,链表有一个特殊的指针头指针,始终指向链表的第1个节点,常用head来表示它。单向链表的最后一个节点不再指向其它节点,它的指针成员里存放NULL,表示空地址。,单向链表,是指数据接点按单向排列的链表。一个单链表结点,其结构类型分为两部分:(1)数据域:用来存储本身数据(2)链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。,例:typedefstructnodeintdata;structnode*next;NODE;NODE*head,*p;,8.5链表,链表是通过节点的不断连接生成的,对节点的基本操作主要有以下几种:(1)分配节点:(2)赋值:(3)入链(插入):(4)出链(删除):(5)释放空间:,使用动态内存分配函数malloc分配节点空间。,8.5链表,链表是通过节点的不断连接生成的,对节点的基本操作主要有以下几种:(1)分配节点:(2)赋值:(3)入链(插入):(4)出链(删除):(5)释放空间:,把节点连接到链表中。插入点有一前一后两个节点,先把后一个节点的地址赋值给新节点的节点指针成员,再把新节点的地址赋值给前一个节点的节点指针成员。(后给新,新给前),8.5链表,27,链表是通过节点的不断连接生成的,对节点的基本操作主要有以下几种:(1)分配节点:(2)赋值:(3)入链(插入):(4)出链(删除):(5)释放空间:,把节点从链表中删除。只需把被删节点的后一个节点的地址赋值给前一个节点的节点指针成员。(后给前),9.5链表,链表是通过节点的不断连接生成的,对节点的基本操作主要有以下几种:(1)分配节点:(2)赋值:(3)入链(插入):(4)出链(删除):(5)释放空间:,使用动态内存释放函数free分配节点空间。,9.5链表,有以下结构体说明和变量定义,指针p,q,r分别指向一个链表中的3个连续节点。structnodeintdata;structnode*next;*p,*q,*r;现要将q和r所指节点的先后位置交换,以下错误的程序段是:A)r-next=q;q-next=r-next;p-next=r;B)q-next=r-next;p-next=r;r-next=q;C)p-next=r;q-next=r-next;r-next=q;D)q-next=r-next;r-next=q;p-next=r;,例:,8.5链表,设有以下定义:structssintinfo;structss*link;x,y;且已建立如图所示链表结构。请写出删除节点y的赋值语句。将y插入链表原位的赋值语句。,例:,x.link=y.link;,y.link=x.link;x.link=,8.5链表,注:当说明一个共用体变量时,编译程序自动地产生一个变量,其长度为共用体中最大的变量长度。,共用体类型的定义和共用体变量的定义与结构十分相似,其形式为:,union联合名数据类型成员名;数据类型成员名;.联合变量名;,8.6共用体,共用体类型的定义和共用体变量的定义与结构十分相似,其形式为:,注:共用体表示几个成员公用一个内存位置,在不同的时间保存不同的成员和数据类型。,u1,p,8.6共用体,u2,共用体变量的初始化只能对其第一个成员进行。如:,unionuncharc;inti;floatf;u1=a;,9.6共用体,共用体变量中每个成员的引用方式与结构体的完全相同:,共用体变量名.成员名;指针变量名-成员名;,9.6共用体,unionshorth;structcharfirst;charsecond;half;number;,输出结果为:AB6261,number.h=0 x4241;printf(“%c%c”,number.half.first,number.half.second);number.half.first=a;number.half.second=b;printf(%hxn,number.h);,共用体举例:,8.6共用体,共用体变量中每个成员的引用方式与结构体的完全相同:,结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员,而结构的所有成员都存在;对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。,8.6共用体,枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。,例如表示星期的MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY、SUNDAY就是一个枚举。枚举的说明与结构和联合相似,其形式为:,enum枚举名标识符=整型常数,标识符=整型常数,.标识符=整型常数,枚举变量;,8.7枚举,注意:枚举中每个成员(标识符)结束符是逗号“,”而不是分号“;”,最后一个成员可省略逗号“,”。初始化时可以赋负数,以后的标识符仍依次加1。枚举变量只能取枚举说

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论