结构体共用体和用户定义类型课件.ppt

上传人:石*** 文档编号:50960022 上传时间:2022-10-17 格式:PPT 页数:34 大小:2.33MB
返回 下载 相关 举报
结构体共用体和用户定义类型课件.ppt_第1页
第1页 / 共34页
结构体共用体和用户定义类型课件.ppt_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《结构体共用体和用户定义类型课件.ppt》由会员分享,可在线阅读,更多相关《结构体共用体和用户定义类型课件.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、结构体共用体和用户定义类型第1页,此课件共34页哦功能:用功能:用“标识符标识符”来为已存在的来为已存在的“类型名类型名”命名,命名,并未产生并未产生新的数据类型。新的数据类型。用户定义的标识符,用作新的类型名已经存在的类型标识符typedef语句形式:语句形式:typedef typedef 类型名类型名 标识符;标识符;13.1 用用typedeftypedef说明一种新类型名说明一种新类型名例如:例如:typedef char*CHAR;CHAR p;等价于等价于 char*p;typedef int NUM10;NUM n;等价于等价于 int n10;第2页,此课件共34页哦说明说明

2、:1.typedef 1.typedef 没有创造没有创造新数据类型新数据类型2.typedef 2.typedef 是定义类型是定义类型,不能定义变量不能定义变量3.typedef 3.typedef 与与 define define 不同不同 define typedefdefine typedef预编译时处理预编译时处理 编译时处理编译时处理简单字符置换简单字符置换 为已有类型命名 第3页,此课件共34页哦结构体:是一种结构体:是一种自定义的构造自定义的构造数据类型。数据类型。用途:把用途:把不同类型不同类型的数据组合成一个整体。的数据组合成一个整体。struct 结构体名结构体名 类型

3、标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体13.2.1 13.2.1 结构体类型定义结构体类型定义:13.2 13.2 结构体结构体第4页,此课件共34页哦例例 struct student int num;char name20;char sex;int age;float score;char addr30;namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式(图纸),不分配内存结构体类型的定义第5页,此课件

4、共34页哦例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;13.2.2 13.2.2 结构体变量的定义结构体变量的定义(1)(1)、先定义结构体类型,再定义结构体变量、先定义结构体类型,再定义结构体变量n一般形式:一般形式:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct struct 结构体名结构体名 变量名表列变量名表列;例#define STUDENT st

5、ruct student STUDENT int num;char name20;char sex;int age;float score;char addr30;STUDENT stu1,stu2;第6页,此课件共34页哦n(2)(2)、定义结构体类型的同时定义结构体变量、定义结构体类型的同时定义结构体变量一般形式:一般形式:struct struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名成员名;.变量名表列变量名表列;例 struct student int num;char name20;char sex;int age;float sco

6、re;char addr30;stu1,stu2;第7页,此课件共34页哦n(3)(3)、直接无名结构体的同时定义结构体变量、直接无名结构体的同时定义结构体变量一般形式:一般形式:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.变量名列变量名列表表;例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;用用无名结构体无名结构体直接定义变量直接定义变量只能一次只能一次通常用在不需要再次定义此类型结构变通常用在不需要再次定义此类型结构变量量第8页,此

7、课件共34页哦n(4)(4)、使用、使用typedeftypedef说明一个结构体类型名,再用新类说明一个结构体类型名,再用新类型名定义变量型名定义变量一般形式:一般形式:typedef struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.标识符标识符;标识符标识符 变量名列表;变量名列表;例例 typedef struct int num;char name20;char sex;int age;float score;char addr30;student;student std,pers3,*pstd;第9页,此课件共34页哦n说明说明n结构体类型

8、与结构体变量概念不同结构体类型与结构体变量概念不同n类型类型:不分配内存不分配内存;变量变量:分配内存分配内存n类型类型:不能赋值、存取、运算不能赋值、存取、运算;变量变量:可以可以n结构体成员名结构体成员名(域名)与程序中变量名地位相同域名)与程序中变量名地位相同n结构体可嵌套结构体可嵌套例 struct date int month;int day;int year;struct student int num;char name20;struct date birthday;stu;numnamebirthdaymonthdayyear例 struct student int num;c

9、har name20;struct date int month;int day;int year;birthday;stu;numnamebirthdaymonthdayyear第10页,此课件共34页哦 12.2.312.2.3结构体变量的初始化结构体变量的初始化 和其他类型的变量相同,和其他类型的变量相同,在定义结构体变量时赋初值在定义结构体变量时赋初值形式一:形式一:struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;struct 结构体名结构体名 结构体变量结构体变量=初始数据初始数据;例 struct student in

10、t num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;第11页,此课件共34页哦n形式二:形式二:struct 结构体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名成员名;.结构体变量结构体变量=初始数据初始数据;例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijin

11、g Road”;第12页,此课件共34页哦n形式三:struct 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.结构体变量结构体变量=初始数据初始数据;例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;第13页,此课件共34页哦12.2.412.2.4 结构体变量的引用结构体变量的引用n引用规则引用规则n 结构体变量结构体变量不能整体引用不能整体引用,只能引用变量只能引用变量成员成员n可以将一个结构体变量赋值给

12、另一个结构体变量可以将一个结构体变量赋值给另一个结构体变量n结构体嵌套时逐级引用结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:引用方式:结构体变量名结构体变量名.成员名成员名例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age+;例 struct student int num;char name20;char sex;int

13、age;float score;char addr30;stu1,stu2;printf(“%d,%s,%c,%d,%f,%sn”,stu1);()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”;()例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;stu2=stu1;()例 struct student int num;char name20;struct date int month;int day;int year;birthday;s

14、tu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;if(stu1=stu2).()第14页,此课件共34页哦12.2.5 12.2.5 结构体数组结构体数组1 1、结构体数组的定义和初始化、结构体数组的定义和初始化 定义:三种形式:定义:三种形式:形式一:struct student int num;char name20;char sex;int ag

15、e;struct student stu2;形式二:struct student int num;char name20;char sex;int age;stu2;形式三:struct int num;char name20;char sex;int age;stu2;numnamesexagenumnamesexagestu0stu125B第15页,此课件共34页哦初始化:与其他类型的数组赋初值的方法相同初始化:与其他类型的数组赋初值的方法相同例 struct int num;char name20;char sex;int age;stu=,;顺序初始化:struct student i

16、nt num;char name20;char sex;int age;struct student stu=100,“Wang Lin”,M,20,101,“Li Gang”,M,19,110,“Liu Yan”,F,19;分元素初始化:struct student int num;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页,此课件共34页哦2 2、结构体数组引用、结构体数组引用引用方式:引用方式

17、:结构体数组名结构体数组名 下标下标.成员名成员名stu1.age+;struct student int num;char name20;char sex;int age;str3;strcpy(stu0.name,”ZhaoDa”);numnamesexagenumnamesexagestu0stu125B第17页,此课件共34页哦12.2.6 12.2.6 向函数传递结构体型数据向函数传递结构体型数据 函函数数之之间间的的参参数数传传递递也也可可以以是是结结构构体体型型数数据据,既既可可以以通通过过参参数传送结构体变量的成员,也可以通过参数传递整个结构体变量。数传送结构体变量的成员,也可

18、以通过参数传递整个结构体变量。1.1.向函数传递结构体变量的成员向函数传递结构体变量的成员 若若结结构构体体变变量量的的成成员员是是基基本本类类型型,则则作作函函数数的的实实参参时时的的用用法法与与普普通通变变量量作作函函数数的的实实参参的的用用法法相相同同,形形参参与与实实参参之之间间仍仍然然是是“值传递值传递”的方式。的方式。2.2.向函数传递结构体变量向函数传递结构体变量 ANSI ANSI C C允允许许函函数数之之间间传传递递结结构构体体变变量量。若若实实参参是是结结构构体体变变量量,那那么么形形参参也也应应是是同同类类型型的的结结构构体体变变量量。系系统统将将为为结结构构体体类类型

19、型的的形形参参开开辟辟相相应应的的存存储储单单元元,并并将将实实参参中中各各成成员员的的值值赋赋给给对对应应的的形形参参成员。成员。“值传递值传递”第18页,此课件共34页哦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

20、arg.c=%dn,arg.a,arg.b,arg.c);void func(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);arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga

21、:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例例 用结构体变量作函数参数用结构体变量作函数参数第19页,此课件共34页哦3.3.传递结构体的地址传递结构体的地址 结构体变量的地址作为实参传递,那么形参应是基类型相同的结结构体变量的地址作为实参传递,那么形参应是基类型相同的结构体类型的指针。系统将为结构体类型指针开辟一个存储单元,存放构体类型的指针。系统将为结构体类型指针开辟一个存储单元,存放实参结构体变量的地址值。实参结构体变量的地址值。“地址传递地址传递”typedef struct

22、 char s10;int t;ST;getdata(ST*p)scanf(“%s%d”,p-s,&p-t)main()ST a;getdata(a);printf(“%s,%d”,a.s,a.t);第20页,此课件共34页哦12.2.7 12.2.7 结构体和指针结构体和指针指向结构体变量的指针指向结构体变量的指针n定义形式:定义形式:struct struct 结构体名结构体名 *结构体指针名结构体指针名;例例 struct student *p;struct student *p;n使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstruct

23、 student int num;char name20;char sex;int age;stu;struct student *p=&stu;(*结构体指针名).成员名结构体指针名-成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例例 指向结构体的指针变量指向结构体的指针变量typedef struct student long int num;char name20;char sex;float score;ST;main()ST stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,Li Lin);p-sex=M;p-s

24、core=89.5;printf(nNo:%ldnname:%snsex:%cnscore:%fn,(*p).num,p-name,stu_1.sex,p-score);例 int n;int *p=&n;*p=10;n=10struct student stu1;struct student *p=&stu1;stu1.num=101;(*p).num=101第21页,此课件共34页哦注意:注意:若有:若有:struct struct int a;int a;char*s;char*s;x,*p=&x;x,*p=&x;变量变量x x的成员的成员a a,指针成员,指针成员s s已正确赋值已正确

25、赋值(*p).a (*p).a 等价于等价于 p-ap-a+p-a;+p-a;等价于等价于+(p-a);+(p-a);p p所指变量所指变量x x中成员中成员a a增增1 1(p+)-a;(p+)-a;等价于等价于p+-a;p+-a;访问访问p p所指变量所指变量x x中成员中成员a a之后,指针之后,指针p p增增1 1。*p-s p-s 引用变量引用变量x x中中s s所指存储单元所指存储单元*p-s+p-s+引用了引用了s s所指存储单元之后,所指存储单元之后,s s指针加指针加1 1(*p-s)+(*p-s)+使得使得s s所指向的存储单元的值增所指向的存储单元的值增1 1*p+-s

26、*p+-s 访问了访问了s s所指存储单元之后,使所指存储单元之后,使p p增增1 1第22页,此课件共34页哦12.2.8 12.2.8 利用结构体变量构成链表利用结构体变量构成链表 1、链表的特点:链表的特点:n链表是一种动态的进行存储分配的数据结构,程序执行中,可以链表是一种动态的进行存储分配的数据结构,程序执行中,可以在需要时开辟存储单元,在不需要时释放存储单元。在需要时开辟存储单元,在不需要时释放存储单元。n链表的结点包含数据域和链接域,数据域用来保存数据信息,链表的结点包含数据域和链接域,数据域用来保存数据信息,链接域用来保存该结点的后继结点或前驱结点的地址。链接域用来保存该结点的

27、后继结点或前驱结点的地址。n一个链表用一一个链表用一个头指针个头指针来保存该链表的首地址,即第一个结点来保存该链表的首地址,即第一个结点的地址。头指针是一个链表的标志。的地址。头指针是一个链表的标志。n此链表只能从当前节点找到后继节点,故称为单链表。此链表只能从当前节点找到后继节点,故称为单链表。一个单链表的逻辑示意图:一个单链表的逻辑示意图:第23页,此课件共34页哦【e12_1】一个简单的单链表。一个简单的单链表。typedef struct slist int data;struct slist*next;SLIST;main()SLIST n1,n2,n3,*head,*p;head=

28、&n1;n1.data=1;n1.next=&n2;n2.data=2;n2.next=&n3;n3.data=3;n3.next=0;printf(n);for(p=head;p!=0;p=p-next)printf(%3d,p-data);第24页,此课件共34页哦2 2、建立单链表、建立单链表主要步骤为:主要步骤为:n 生成只含有头结点的空链表;生成只含有头结点的空链表;n 然然后后读读取取数数据据信信息息,生生成成新新结结点点,将将数数据据存存放放于于新新结结点点中,中,插入新结点到单链表中插入新结点到单链表中n 重复第二步,直到输入结束。重复第二步,直到输入结束。根据新结点插入到链表

29、的位置的不同,建立链表的方式,根据新结点插入到链表的位置的不同,建立链表的方式,分为在表尾插入的方法和在表头插入的方法。分为在表尾插入的方法和在表头插入的方法。n表尾插入表尾插入:e12_表头插入表头插入:e12_3.c 第25页,此课件共34页哦e12_2.cSLIST *CreateList()SLIST*p,*head,*q;int x;head=(SLIST*)malloc(sizeof(SLIST);/生成头结点生成头结点 p=head;/尾指针指向头结点尾指针指向头结点 scanf(“%d”,&x);while(x!=-1)q=(SLIST*)malloc(sizeof(SLIST

30、);q-data=x;p-next=q;p=q;scanf(“%d”,&x);p-next=NULL;return head;第26页,此课件共34页哦e12_3cSLIST *CreateList()SLIST*p=NULL,*head,*q;int x;scanf(“%d”,&x);while(x!=-1)q=(SLIST*)malloc(sizeof(SLIST);q-data=x;q-next=p;p=q;scanf(“%d”,&x);head=(SLIST*)malloc(sizeof(SLIST);/*/*建立头节点建立头节点*/head-next=p;return head;第2

31、7页,此课件共34页哦3 3、在单链表中插入结点、在单链表中插入结点 设指针变量设指针变量s s指向待插入结点,假设指定结点为指向待插入结点,假设指定结点为p p。n 插入到指定结点之后:插入到指定结点之后:snext=pnext;pnext=s;n 插入到指定结点之前:首先要找到插入到指定结点之前:首先要找到p p的前驱结点的前驱结点q q。p202 14.8p202 14.8 第28页,此课件共34页哦4 4、在单链表中删除结点、在单链表中删除结点 在一个单链表中删除指定结点,首先要找到该结点的前驱在一个单链表中删除指定结点,首先要找到该结点的前驱结点,然后修改前驱结点的指针域指向待删结点

32、的后继结点,然结点,然后修改前驱结点的指针域指向待删结点的后继结点,然后释放被删结点。后释放被删结点。第29页,此课件共34页哦12.3 12.3 共用体共用体 公用体类型说明和变量定义与结构体方式完全相同,不同公用体类型说明和变量定义与结构体方式完全相同,不同的是公用体变量的所有成员占有同一个存储空间。的是公用体变量的所有成员占有同一个存储空间。12.3.1 共用体类型共用体类型union 共用体名 类型标识符类型标识符 成员名;成员名;类型标识符类型标识符 成员名;成员名;.;例例 union data int i;char ch;float f;类型定义不分配内存fchi100地址开始定

33、义形式:第30页,此课件共34页哦形式二:union data int i;char ch;float f;a,b;形式一:union data int i;char ch;float f;union data a,b,c,*p,d3;形式三:union int i;char ch;float f;a,b,c;12.3.2 共用体变量的定义fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在1、共用体变量的定义第31页,此课件共34页哦2 共用体变量引用n引用方式:例 a.i=1;a.ch=a;a.f=1.5;printf(“%d”,a.i);

34、(编译通过,运行结果不对)n引用规则n不能引用共用体变量,只能引用其成员共用体指针名-成员名共用体变量名.成员名(*共用体指针名).成员名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.fn共用体变量中起作用的成员是最后一次存放的成员例 union int i;char ch;float f;a;a=1;()n不能在定义共用体变量时初始化例 union int i;char ch;float f;a=1,a,1.5

35、;()n可以用一个共用体变量为另一个变量赋值例 float 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;()第32页,此课件共34页哦例e12_4.c 将一个整数按字节输出01000010 01000001低字节高字节0100000101000010ch0ch1运行结果:i=16961ch0=101,ch1=102ch0=A,ch1=Bmain()union int_char int i;char ch2;x;x.i=16961;printf(i=%on,x.i);printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);第33页,此课件共34页哦n结构体与共用体n区别:存储方式不同struct node char ch2;int k;a;union node char ch2;int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在n联系联系:两者可相互嵌套两者可相互嵌套第34页,此课件共34页哦

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁