C11结构体与共用体.ppt_第1页
C11结构体与共用体.ppt_第2页
C11结构体与共用体.ppt_第3页
C11结构体与共用体.ppt_第4页
C11结构体与共用体.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、第十一章 结构体与共用体,教学目标 掌握结构体类型及结构体变量的定义与引用方法; 理解结构体变量的存储结构; 初步掌握链表的概念及对链表的基本操作; 了解共用体类型及共用体类型变量的定义 ; 了解枚举类型的定义方法及枚举类型数据的使用 ; 了解用typedef定义数据类型别名的方法。 基本要求 能够阅读、编写和调试有关结构体的应用程序,初步掌握有关链表的一些基本操作。,第十一章 结构体与共用体,11.1 结构体类型 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或

2、构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,一、结构体类型的定义,struct student int num; char name20; char sex; int age; float score; char addr30; ;,结构体类型定义只描述结构的组织形式,不分配内存。,例:结构体类型的定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ; struct 结构体名 变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char ad

3、dr30; ; struct student stu1,stu2;,1. 先定义结构体类型,再定义结构体变量,二、结构体变量的定义(三种形式),一般形式1:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,一般形式2:,2. 定义结构体类型的同时定义结构体变量,一般形式3:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct i

4、nt num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用无名结构体直接定义 变量,只能一次.,3. 直接定义无名结构体变量,结构体类型与结构体变量概念不同。 类型:不分配内存; 变量:分配内存 类型:不能赋值,存取,运算; 变量:可以赋值,存取,运算 结构体类型可以嵌套定义。 结构体类型及变量的作用域与生存期。,例 struct date int month; int day; int year; ; struct student int num; char name20; struct dat

5、e birthday; stu;,说明:,变量stu的存储结构:,1. 引用方式: 结构体变量名.成员名,2. 引用规则:结构体变量不能整体引用,只能引用变量成员,三、结构体变量的引用,成员(分量)运算符 优先级: 15(最高) 结合性:从左向右,结构体变量的引用示例,例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2 =101,Wan Lin;,stu1.birthday.month=12;,3. 结构体嵌套时应逐级引用,stu1=102,Wa

6、n Lin; (),4. 特例: C语言允许:将一个结构体变量的值 整体赋值给另一个结构体变量。 例如:stu1=stu2; (),struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,Wang Lin,M,19, 200 Beijing Road;,四、结构体变量的初始化 形式一:,struct 结构体名 类型标识符 成员名; 类型

7、标识符 成员名; . 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,Wang Lin,M,19, 200 Beijing Road;,形式二:,struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,Wang Lin,M,19, 200 Beijing Road;,形式三:,形式一: s

8、truct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,11.2 结构体数组一、结构体数组的定义,顺序初始化: struct student int num; char name20; char sex; int age; ; struct stu

9、dent stu =100,Wang Lin,M,20, 101,Li Gang,M,19, 110,Liu Yan,F,19;,例:定义类型时省略类型名 struct int num; char name20; char sex; int age; stu =,;,二、结构体数组初始化,例:定义类型的同时定义变量并初始化 struct student int num; char name20; char sex; int age; stu =,;,结构体数组初始化示例,引用方式: 结构体数组名下标.成员名,struct student int num; char name20; char s

10、ex; int age; stu3;,stu1.age+; stu2.age=18;,strcpy(, ZhaoDa);,三、结构体数组引用,struct person char name20; int count; leader3=Li1,0, Zhang2,0, Wang3,0; void main() int i, j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.coun

11、t+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,例 统计后选人选票,存放结构体变量在内存中的起始地址,1. 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,11.3 指向结构体的指针 一、指向结构体变量的指针,(*结构体指针名).成员名,结构体指针名-成员名,指向成员运算符 优先级: 15 (最高) 结合方向:从左向右,例 指向结构体的指针变量,struct student stu1; struct student *p=,2. 使用结构体指针变量引用成员,main()

12、 struct student long int num; char name20; char sex; float score; stu_1,*p; p= ,例 指向结构体的指针变量,struct student int num; char name20; 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); ,例 指向结构体数组的指针,二、指向结构体数

13、组的指针,11.4 结构体与函数,1. 结构体类型变量可以作为函数实参,struct data int a, b, c; ; main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); void fu

14、nc(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n); ,2.函数可以返回结构体类型的值(例11.7),#include #include struct student char num10; char nam

15、e20; float score; void PrintStruct(struct student stud) printf(%s %s %gn,stud.num,,stud.score); struct student InitialStruct(char *num,char *name,float score) struct student stud; strcpy(stud.num,num); strcpy(,name); stud.score=score; return stud; void main() struct student stud ;

16、stud=InitialStruct(00001,Xiao Li,98.5); PrintStruct(stud); ,struct data int a, b, c; ; void main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func( ,3. 用结构体指针变量作函数参数,11.5 链表,链表是一种常

17、见的重要数据结构,它的主要功能是进行动态存、取数据。 链表的实现方式是:构造一个结构体,在此结构体中除了数据成员外;还有一个指针成员,用来记录下一个数据的位置。这样的结构体我们称之为链表中的结点。,图11.11 链表结构示意图,struct tag /*数据成员列表*/ struct tag *nextPtr; ;,1.静态链表,#include struct node int data; struct node *nextPtr; void main() struct node a,b,c,*h,*p; a.data=3; b.data=6; c.data=9; p=h= ,运行结果为: 3

18、 6 9,2.动态链表,p=(struct node*)malloc(sizeof(struct node) p-data=100; c.nextPtr = p; /*将新节点加到链表的尾部*/ p-nextPtr= 0; /*NULL*/ p=(struct node*)malloc(sizeof(struct node) p-data=200; c.nextPtr.nextPtr =p; p-nextPtr= 0; /*NULL*/ free(p) /*从内存中将p所指向的内存块删除*/,NCRE 2004年4月考题(几乎每次都考),#include #include struct NOD

19、E int num; struct NODE *next; ; void main() struct NODE *p,*q,*r; int sum=0; p=(struct NODE *) malloc(sizeof(struct NODE); q=(struct NODE *) malloc(sizeof(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-

20、num; printf(sum=%dn ,sum); /* sum= 4*/ free(p); free(q); free(r); ,union 共用体名 类型标识符 成员名; 类型标识符 成员名; . ;,例 union data int i; char ch; float f; ;,类型定义不分配内存,共用体是一种构造数据类型,也叫联合体。 用途:所有的成员均共用一段存储区域(相互覆盖)。 一、共用体类型定义 定义形式:,11.6 共用体,形式二: union data int i; char ch; float f; a,b;,形式一: union data int i; char ch

21、; float f; ; union data a,b,*p,d3;,形式三: union int i; char ch; float f; a,b,c;,共用体变量定义分配内存,长度=最长成员所占字节数,二、共用体变量的定义,引用规则特例 可以用一个共用体变量为另一个变量赋值,引用规则 只能引用其成员,不能引用共用体变量。,union data int i; char ch; float f; ; union data a,b,d3,*p=d;,a.i=8; a.ch=A; a.f=1.5;,p-i ; p-ch ; p-f ;,(*p).i; (*p).ch ; (*p).f;,d0.i

22、; d0.ch ; d0.f;,三、共用体变量引用,a=1; (),b=a; (),#include union int i ; char ch ; float f ; a; main() a.i=65; printf(a.i=%d, a, ch=%dn, a.i, a.ch); a.ch=a; printf(a.i=%d, a.ch=%dn, a.i, a.ch); a.f=1.5; printf(a.f=%f, a.i=%dn, a.f, a.i); ,引用规则 不能在定义共用体变量时初始化 共用体变量中起作用的成员是最后一次存放的成员,例 union int i; char ch; fl

23、oat f; a=1, a,1.5; (),共用体变量引用示例,运行结果: i=60501 ch0=101,ch1=141 ch0=A,ch1=a,main() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1); ,例 将一个整数按字节输出,区别: 存储方式不同 联系: 两者可相互嵌套,四、结构体与共用体的区别,struct int num; char name10; char sex; c

24、har job; union int class; char position10; category; person2;,例 结构体中嵌套共用体,11.7 枚举类型,C语言提供了另一种用户定义类型称为枚举(enumeration)。枚举就是用标识符表示的整数常量的集合,用关键字enum定义。 从效果上看,枚举常量是自动设置值的符号常量。枚举常量的起始值默认为0,以后的值依次递增1。 枚举类型的定义形式为: enum 枚举类型名 成员名=整数常量 ; 如:enum monthsJAN,FEB,MAR ; 则:JAN=0, FEB=1, MAR=2 。 如:enum monthsJAN=1,FE

25、B,MAR ; 则:JAN=1, FEB=2, MAR=3 。 如:enum monthsJAN=100,FEB,MAR=200 ; 则:JAN=100, FEB=101, MAR=200 。 枚举型的作用:增加程序的可读性。,功能:用自定义名字为已有数据类型命名 1. 类型定义简单形式: typedef type name;,例 typedef int INTEGER; typedef float REAL;,类型定义语句关键字,已有数据类型名,用户定义的类型名,类型定义后,与已有类型一样使用,例 INTEGER a,b,c; REAL f1,f2;,说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同,define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名,11.8 用typedef定义类型,例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,

温馨提示

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

评论

0/150

提交评论