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

下载本文档

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

文档简介

1、1第11章2 本章要点本章要点结构体的概念结构体的概念结构体的定义和引用结构体的定义和引用结构体数组结构体数组 3 主要内容主要内容11.1 11.1 结构体类型结构体类型11.2 11.2 结构体数组结构体数组 11.3 11.3 指向结构体的指针指向结构体的指针11.4 11.4 结构体与函数结构体与函数11.5 11.5 链表链表11.11.共用体共用体11.7 11.7 枚举类型枚举类型 11.8 11.8 用用typedeftypedef定义一种新类型名定义一种新类型名4问题定义:问题定义: 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。如:如:一个学生有学号/姓名/性别

2、/年龄/成绩/地址等属性 char num10; char name20; char sex; int age; float score;char addr30; n 应当把它们组织成一个组合项,在一个组合n项中包含若干个类型不同(当然也可以相同)n的数据项。n n 图11-1100101 Li Fun M 18 87.5 Beijing Num name sex age score addr5第十一章 结构体与共用体11.1 结构体类型结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型一、结构体类型的定义struct 结构体名 类型标识符 成员名; 类型标识符 成员

3、名; .;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体6例 struct student char num10; char name20; char sex; int age; float score; char addr30; ; 结构体类型定义只描述结构的组织形式,不分配内存。结构体类型定义的作用域与变量的作用域类似,若将类型定义放在某个函数内,则只能在该函数内定义这种结构体类型的变量。例:结构体类型的定义7struct 结构体名类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 变量名表列;例 struct student ch

4、ar num10; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 1. 先定义结构体类型,再定义结构体变量v一般形式: 二、结构体变量的定义namenumsexagescoreaddr10字节2字节20字节1字节4字节30字节.8struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .变量名表列;例 struct student char num10; char name20; char sex; int age; float score; char ad

5、dr30; stu1,stu2; 一般形式:2. 定义结构体类型的同时定义结构体变量9一般形式:struct 类型标识符 成员名; 类型标识符 成员名; .变量名表列;例 struct char num10; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用无名结构体直接定义变量只能一次3. 省略结构体名,直接定义结构体变量10v结构体类型与结构体变量概念不同。l类型:不分配内存; 变量:分配内存l类型:不能赋值、存取、运算; 变量:可以v结构体类型可以嵌套定义。v结构体成员名与程序中变量名可相同,不会

6、混淆。v结构体类型及变量的作用域与生存期。例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnamebirthdaymonthdayyear例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyear说明:111. 引用方式: 结构体变量名.

7、成员名例 struct student char num10; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=200608247;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;2. 引用规则:结构体变量不能整体引用,只能引用变量成员三、结构体变量的引用成员(分量)运算符优先级: 15(最高)结合性:从左向右例 struct student char num10; char name20; char sex; int age; flo

8、at score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ()if(stu1=stu2). ()12例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2 =101,“Wan Lin”;numnamebirthdaymonthdayyearstu1.birthday.month=12;3.

9、结构体嵌套时应逐级引用4. 结构体变量可以整体赋值给另一个结构体变量stu1=stu2; ()stu1=102,“Wan Lin”; ()13四、结构体变量的初始化结构体变量的初始化是指在定义结构体变量的同时为其成员变量赋初值。 P233例11.114形式一: struct student char num10; char name20; char sex; int age; ;struct student stu2;形式二: struct student char num10; char name20; char sex; int age; stu2;形式三: struct char num

10、10; char name20; char sex; int age; stu2;numnamesexagenumnamesexagestu0stu133B11.2 结构体数组 一、结构体数组的定义15例:定义类型时省略类型名 struct char num10; char name20; char sex; int age; stu =,;顺序初始化: struct student char num10; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19,

11、110,“Liu Yan”,F,19; 例:定义类型的同时,定义变量并初始化struct student char num10; char name20; char sex; int age; stu =,;分行初始化: struct student char num10; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化时维数可省二、结构体数组初始化16引用方式: 结构体数组名下标.成员名 struct

12、student char num10; char name20; char sex; int age; str3;stu1.age+;strcpy(,”ZhaoDa”);三、结构体数组引用17P234例例11.2 先定义一个学生信息结构体,包括学号、姓名、性别、出生日期及3门课的分数和总分,再定义3位学生信息的结构体数组并初始化,计算每位同学的总分,然后输出所有学生信息。 18存放结构体变量在内存中的起始地址numnamesexagestupstruct student char num10; char name20; char sex; int age; stu;struc

13、t student *p=&stu;1. 定义形式:struct 结构体名 *结构体指针名;例 struct student *p;11.3 指向结构体的指针 一、指向结构体变量的指针19(*结构体指针名).成员名结构体指针名-成员名指向成员运算符优先级: 15 (最高)结合方向:从左向右例 指向结构体的指针变量struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=101; p-num=101;2. 使用结构体指针变量引用成员20struct student char num10; char nam

14、e20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age);例 指向结构体数组的指针numnamesexagestu0pstu1stu2p+1二、指向结构体数组的指针21在对结构体类型指针变量进行操作时,要特别注意其含义与效果假定stud是一个struct student类型的数组,p是指向stud起始地址的指针变量,则:(1)+p-score表示把stud

15、0的成员score自加1。由于指向成员运算符-的优先级别高,所以,+p-score相当于+(p-score)。(2)(+p)-score表示先使结构体指针变量p自加1,指向下一个数组元素的起始地址,再引用它所指向的数组元素的成员score的内容,即stud1 .score 。(3)(p+)-score表示先引用结构体指针变量p所指数组元素的成员score的内容,即stud0 .score ,再对指针变量p作自加1操作,使该指针变量指向下一个数组元素stud1的起始地址。2211.4 结构体与函数1. 结构体变量可以作为函数参数 2 函数可以返回结构体类型的值3. 用结构体指针变量作函数参数23

16、11.5 链表 链表是一种常见的重要数据结构,它的主要功能是进行动态存、取数据。 链表的实现方式是:构造一个结构体,在此结构体中除了数据成员外;还有一个指针成员指针成员,用来记录下一个数据的位置。这样的结构体我们称之为链表中的结点(数据域和指针域)。图11.11 链表中的结点示意图struct tag /*数据成员列表*/ struct tag *nextPtr;241.1.静态链表静态链表 程序开始运行时生成的例例11118 8建立一个如图11.6所示三个学生电话簿的静态链表。链表头指针指向的结点称为链表的头结点,而结点的指针域值为空(NULL)的结点为链表的尾结点。8081123Ye808

17、1124LiNULL8081125Chenhead图11.6 一个链表的逻辑结构图252.2.动态动态链表链表 所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。NULL8081123Yephead(a)8081123YeNULL8081124Lih e adqp(b)8081123YeNULL8081124Liheadqp(c)26NCRE 2004年4月考题(每次都要考)#include struct NODE int num; struct NODE *next; ;void main() struct NODE

18、*p,*q,*r; int sum=0; p=(struct NODE *) malloc(sizeof(struct NODE); q=(struct NODE *) malloc(sizcef(struct NODE); r=(struct NODE *) malloc(sizeof(struct NODE); p-num=1; q-num=2; r-num=3; p-next=q; q- next=r; r-next=NULL; sum+=q-next-num; sum+=p-num; printf(sum=%dn ,sum); /* sum= 4*/ 1 2 3 NULLpqr273.

19、3.遍历遍历链表(略)链表(略)遍历链表就是从头结点开始依次查看(或输出)链表中的各个结点数据。4.4.在链表中添加结点在链表中添加结点(略)(略)5.5.在链表中删除结点在链表中删除结点(略)(略)6.6.链表综合应用链表综合应用(略)(略)28union 共用体名类型标识符 成员名; 类型标识符 成员名; . ;例 union data int i; char ch; float f; ;fchi类型定义不分配内存共用体是一种构造数据类型,也叫联合体。用途:所有的成员均共用一段存储区域(相互覆盖)。一、共用体类型定义定义形式:11.6 共用体三个成员共用这4个字节的存储空间29形式二: u

20、nion data int i; char ch; float f; a,b;形式一: union data int i; char ch; float f; ; union data a,b,*p,d3;形式三: union int i; char ch; float f; a,b,c;fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数当某个成员的值发生变化时,其它成员的值也会变。二、共用体变量的定义30例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果不对) v引用规则l不能引用共用体变量,只能引用其成员共用体指针

21、名-成员名共用体变量名.成员名(*共用体指针名).成员名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.fl共用体变量中起作用的成员是最后一次存放的成员例 union int i; char ch; float f; a; a=1; () l不能在定义共用体变量时初始化例 union int i; char ch; float f; a=1,a,1.5; () l可以用一个共用体变量为另一个变量赋值例 f

22、loat x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()三、共用体变量引用31例例11.14 11.14 设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务,如下表。要求输入人员数据,然后输出。numnamesexjobclass(班级)position(职务)8247YeWenjuanFS6021001DuYoufuMTprofessor32v区别: 存储方式不同v联系: 两者可相互嵌套struct no

23、de char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在四、结构体与共用体的区别3311.7 枚举类型 C 语 言 提 供 了 另 一 种 用 户 定 义 类 型 称 为 “ 枚 举”(enumeration)。枚举就是用标识符表示的整数常量的集合,用关键字enum定义。 从效果上看,枚举常量是自动设置值的符号常量符号常量。枚举常量的起始值默认为0,以后的值依次递增1。枚举类型的定义形式为: enum 枚举类型名枚举类型名 成员名=整数常量 ;如:enum monthsJAN,FEB,MAR ; 则:JAN=

温馨提示

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

评论

0/150

提交评论