用户自定义数据类型.ppt
《用户自定义数据类型.ppt》由会员分享,可在线阅读,更多相关《用户自定义数据类型.ppt(60页珍藏版)》请在三一办公上搜索。
1、第九章 用户自定义数据类型,第九章 用户自定义数据类型一、结构体的概念及使用二、结构体数组三、结构体指针四、链表的概念及基本操作五、共用体的概念及使用六、9.6 枚举类型七、9.7 用typedef定义类型,系统给定的数据类型,在基本类型基础上自己定义的,C语言的数据类型,考虑一个学生的基本信息包括:学号、姓名、性别、年龄、成绩、住址等。这对一名学生来说是一个整体,可以反映出学生的基本情况,如果用单个变量分别表示这几项,例如:sum:学号 name10:姓名 sex:性别 age:年龄 score:成绩 addr30:住址 不能体现出它们之间的内在联系。所以,希望有一种变量,来表示所有这些数据
2、,也就是,把这些基本变量,作为一个整体构成一个新的变量,这种变量就是我们要介绍的结构体变量。,9.1 结构体,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,分号不能省略,例 struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型定义描述结构的组织形式,不分配内存,例如:要想把学生基本
3、情况作为一个整体加以处理,比如:学号、姓名、性别、年龄、成绩、住址等。必须定义结构体类型,例 struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,1、先定义结构体类型,再定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;,定义结构体变量之后为其分配内存单元,结构体变量的定义,2、定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名
4、;类型标识符 成员名;.变量名表列;,例 struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,3、直接定义结构体变量一般形式:,struct 类型标识符 成员名;类型标识符 成员名;.变量名表列;,例 struct int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,用无名结构体直接定义变量只能一次,说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存结构体类型是一个模
5、型,类似系统给定的基本类型比如int、float 等类型,只是结构体类型是用户自定义的而已。结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆,引用规则 结构体变量不能整体引用,只能引用变量成员,成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名,结构体变量的引用,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,结构体变量的引用,形式一:,例 struct student int num;char name20;char sex;int age;char addr30;struct student stu1=112,“Wang Lin”,M,19,
6、“200 Beijing Road”;,结构体变量的初始化,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 结构体变量=初始数据;,形式二:,例 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;
7、char addr30;stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,struct 类型标识符 成员名;类型标识符 成员名;.结构体变量=初始数据;,结构体数组的定义三种形式:,形式一:struct student int num;char name20;char sex;int age;struct student stu30;,形式二:struct student int num;char name20;char sex;int age;stu30;,形式三:struct int num;char name20;char sex;int age;
8、stu30;,9.2 结构体数组,例 统计候选人选票,#include struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;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,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count)
9、;,结构体数组初始化,顺序初始化: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;,例 struct student int num;char name20;char sex;int age;stu=,;,结构体数组引用,引用方式:结构体数组名下标.成员名,Str0.name=“ZhaoDa”,指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例 struct stud
10、ent*p;,存放结构体变量在内存的起始地址,9.3 结构体指针,使用结构体指针变量引用成员形式,指向运算符优先级:1结合方向:从左向右,#includemain()struct student long int num;char name20;char sex;float score;stu_1,*p;p=,例 int n;int*p=n=10,struct student stu1;struct student*p=(*p).num=101,9.3 结构体指针,指向结构体数组的指针,struct student int num;char name20;char sex;int age;st
11、u3=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);,用指向结构体的指针作函数参数用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递用结构体变量作参数-值传递,效率低,struct student void f(struct student stu2).stu1=.;.main().f(stu1);,struct student void f(struct student*p).st
12、u1=.;.main().f(,struct student void f(long num)long num;char name10;stu1=.;.main().f(stu1.num);,构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义定义形式:,union 共用体名 类型标识符 成员名;类型标识符 成员名;.;,例 union data int i;char ch;float f;,类型定义不分配内存,9.5 共用体,形式一:union data int i;char ch;float f;a,b;,形式二:union data int i;cha
13、r ch;float f;union data a,b,c,*p,d3;,形式三:union int i;char ch;float f;a,b,c;,共用体变量的定义,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,共用体变量引用引用方式:,引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i;char ch;float f;a;a=1;(),在定义共用体变量时只能初始化第一个成员,例 union int i;char ch;float f;a=1,a,1.5;(),可以用一个共用体变量为另
14、一个变量赋值,例 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;(),例 将一个整数按字节输出,运行结果:i=60501ch0=101,ch1=141ch0=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);,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套类比:结构体与
15、共用体的定义形式类似,变量定义方式类似,成员引用方式类似。,例 结构体中嵌套共用体,struct int num;char name10;char sex;char job;union int class;char position10;category;person2;,概念:对于数组,编译系统为其分配连续的一片存储单元,而链表,通过动 态分配内存,实现链表中各元素(结点)的数据存放在非连 续的单元中.,如:struct student int num;char name10;struct student*next;/*next 是指向该结构体类型的指针变量,;用来存放下一个结点的起始地址,
16、实现将各结点连接成链*/,9.4 链表,动态分配内存函数:格式1:viod*malloc(unsigned int size)功能:在内存的动态存储区中分配长度为size(单位:byte)连续空间,返回该连续域的首地址(是无类型指针);未成功,返回 0。,struct student int num;char name10;struct student*next;*pt;pt=(struct student*)malloc(sizeof(struct student)pt num name10 next,格式2:calloc(n,size)功能:与 malloc(size)相同,区别是分配n个
17、长度为size 的连续空间。可以为一为数组开辟动态存储空间。,格式:viod free(viod*p)功能:释放由p 指向的内存区,使这部分内存区能被其它变量使用。P 是最近一次调用 calloc 或 malloc 函数时返回的值。free 无返回值。例如:free(p);,numscorenext,建立动态链表 例题:写一个函数建立一个有若干名学生数据的单向动态链表,当学号为 0 建表结束。设结点的结构体类型如下:struct student long num;float score;struct student*next;,numscorenext,实现此要求的算法如下:,head,p1,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 自定义 数据类型
链接地址:https://www.31ppt.com/p-6055370.html