结构体、共用体与枚举.ppt
《结构体、共用体与枚举.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体与枚举.ppt(90页珍藏版)》请在三一办公上搜索。
1、9,结构体、共用体与枚举,本章导读,用户定义类型结构体、共用体和枚举类型,包括它们的定义、变量的说明和应用。结构体类型:结构体数组和指针、结构体变量和指针作为函数参数、返回结构体类型数据的函数、动态内存分配、链表;类型定义符typedef;了解结构体、共用体和枚举类型数据的特点,熟练掌握结构体类型、变量、数组、指针变量的定义、初始化和成员的引用方法;掌握共用体和枚举类型、变量的定义和引用;掌握用户自定义类型的定义和使用。,9.1结构体,【问题】什么是结构体类型?什么是结构体变量?结构体类型与数组类型有什么区别和联系?,结构体类型的定义,结构体类型的定义形式为:struct 类型名成员项表列;例
2、如包含上图中全部类型数据的结构体类型的定义如下:struct person/*结构体类型名*/char name20;/*以下定义成员项的类型和名字*/int age;char sex;long num;char nation;char address20;long tel;,结构体变量的说明,结构体变量的说明有三种方法:1.用已定义的结构体类型名定义变量。例如:struct person student,worker;/*定义了两个结构体变量student和worker*/用上面的结构体类型还可再定义变量:struct person men,women;,2.在定义结构体类型的同时定义结构体
3、变量。例如:struct person char name20;int age;long tel;student,worker;一般的形式为:struct 类型名 成员项表列 变量名表列;这样定义的结构体类型也还可多次使用,如:struct person men,women;,结构体变量的说明,3.不定义结构体类型名,直接定义结构体变量。一般形式为:struct 成员项表列变量名表列;,结构体变量的说明,9.1.3 结构体变量的初始化,在以上结构体变量的三种定义的同时都可以进行初始化赋值,例如:struct person stud1=Wang Li,18,M,34011,h,12,13 Bej
4、ing Road,2098877,stud2=Yu Ping,19,F,34082,h,12,25 Hefei Road,5531678;注意初始化数据应与类型中的各个成员在位置上一一对应。对于嵌套的结构体类型变量,初始化是对各个基本类型的成员赋初值,例如:struct person student=Wang Li,12,5,1974,M,340201,h,12,13 Bejing Road,2098877;,9.1.4 结构体变量的引用,1.引用结构体成员,在无嵌套的情况下,引用结构体变量成员的形式为:结构体变量名成员名,其中的“.”叫“结构体成员运算符”,这样引用的结构体成员相当于一个普通
5、变量,例如:student.num/*结构体变量student的成员num,相当于一个长整型变量*/student.name/*结构体变量student的成员name,相当于一个字符数组名*/,在有嵌套的情况下,访问的应是结构体的基本成员,因为只有基本成员直接存放数据,且数据是基本类型或上面介绍的数组类型,引用形式为:结构体变量名结构体成员名结构体成员名基本成员名 即从结构体变量开始,用成员运算符“.”逐级向下连接嵌套的成员直到基本成员,不能省略,例如:/*基本成员year,相当于一个整型变量*/,9.1.4 结构体变量的引用,2.结构体变量的赋值、输入和输出,由于结构体各个成员的类型不同,对
6、结构体变量赋值也只能对其成员进行,结构体变量的输入和输出也都只能对其成员进行,3.同一类型的结构体变量可相互赋值,同类型的两个结构体变量之间可以整体赋值(请比较数组之间不能整体赋值),stud1=stud2;,9.1.4 结构体变量的引用,【例9-1】输出结构体数据,#include main()struct person char name20;struct int month;int day;int year;bd;char sex;long num;st=Wang Li,12,15,1974,M,340201;printf(%s,%d,%d,%d,st.name,st.bd.year,s
7、t.bd.month,st.bd.day);printf(%c,%ldn,st.sex,st.num);,9.1.5 结构体数组,1.结构体数组的定义,有三种方法。(1)先定义结构体类型,用结构体类型名定义结构体数组,如:struct stud_typechar name20;long num;int age;char sex;float score;struct stud_type student50;,9.1.5 结构体数组,(2)定义结构体类型名的同时定义结构体数组,如:struct stud_typestudent50;(3)不定义结构体类型名,直接定义结构体数组,如:structst
8、udent50;,2.结构体数组的初始化,结构体数组的一个元素相当于一个结构体变量,结构体数组初始化即顺序对数组元素初始化。,如:struct stud_type student3=Wang li,80101,18,M,89.5,Zhang Fun,89102,19,M,90.5,Li Ling,89103,20,F,98;,9.1.5 结构体数组,9.1.5 结构体数组,3.结构体数组的引用。,(1)除初始化外,对结构体数组赋常数值、输入和输出、各种运算均是对结构体数组元素的成员(相当于普通变量)进行的。结构体数组元素的成员表示为:结构体数组名下标.成员名在嵌套的情况下为:结构体数组名下标结
9、构体成员名结构体成员名成员名,(2)结构体数组元素可相互赋值例如:student1=student2;对于结构体数组元素内嵌的结构体类型成员,情况也相同。如:student2.birthday=student1.birthday;,(3)其他注意事项也与结构体变量的引用相同,例如:不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体赋(常数)值;不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体进行输入输出等。,9.1.5 结构体数组,9.1.5 结构体数组,在处理结构体问题时经常涉及字符或字符串的输入,这时要注意:scanf()函数用%s输入字符串遇空格即结束,因此输入
10、带空格的字符串可改用gets函数。在输入字符类型数据时往往得到的是空白符(空格、回车等),甚至运行终止,因此常作相应处理,即在适当的地方增加getchar();空输入语句,以消除缓冲区中的空白符。,【例9-2】输入3个学生的信息然后输出。每个学生的信息包括学号、姓名和4门课程的成绩,#include main()struct stu_type long num;char name20;float score4;st3;int i,j;float t;printf(Enter students datas:n);for(i=0;i3;i+)scanf(%ld,【例9-2】,for(j=0;j4;
11、j+)scanf(%f,结构体指针,1.指向结构体变量的指针变量,(1)指向结构体变量的指针和指向结构体变量的指针变量的定义指向结构体变量的指针是结构体变量所占内存单元的首地址,如定义:struct stu_typelong num;char name20;float score4;student,*p;p=p即指向结构体变量的指针变量。,(2)用指向结构体变量的指针变量表示结构体变量的成员如果象上面那样定义了指向结构体变量的指针变量p以后,*p即表示p所指向的结构体变量student,其成员student.num可表示为:(*p).num 或者 p-num第二种表示与第一种表示等价,运算符“
12、-”与“.”优先级相同,具有最高的优先级。,结构体指针,【例9-3】利用结构体指针变量输出结构体数据,/*EX9-3.C*/main()struct stu_typelong num;char name20;float score2;student=20050101,wang,89,77.5,*p;p=,2.结构体数组与结构体指针变量,一维数组的数组名代表数组的首地址,一维结构体数组也一样。可以将一维结构体数组名赋给指向结构体变量的指针变量,该指针变量将指向下标为0的元素,它可以在数组元素之间移动。,【例9-4】用指向结构体变量的指针变量输出结构体数组,/*EX9-4.C*/main()str
13、uct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p;printf(No.tNametAgen);for(p=st;pnum,p-name,p-age);,【例9-5】输出上例中全部学生的name信息,/*EX9-5.C*/main()struct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p,*q;q=(struct stu_type*)st0.name;fo
14、r(p=q;pq+3;p+)printf(%st,p);,结构体与函数,1.结构体变量和结构体变量成员做函数参数,(1)结构体变量成员作为函数的实参由于结构体变量成员存放基本类型数据,因此这种情况同基本类型有值变量做实参,实现值传递。要注意实参与形参类型的一致。,【例9-6】打印学号为20050102学生的年龄,#define N 3void PRINT(int age)printf(Age:%dn,age);main()struct stu_typelong num;char name20;int age;stN=20050101,wang,19,20050102,li,18,2005010
15、3,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti.age);,(2)结构体变量作为函数参数这种用法的参数形式为:形参:结构体变量;实参:有值结构体变量或结构体数组元素。通过实参将相应的结构体类型数据传给对应的形参,实现传值调用,不同于数组作参数的传址调用!【注意】在结构体类型数据作为函数参数时,为了在虚实结合时保持形参与实参类型的一致,应将结构体类型定义成外部的,即在所有函数之前定义结构体类型。,结构体与函数,【例9-7】打印学号为20050102学生的全部信息,#define N 3struct stu_typelong
16、num;char name20;int age;void PRINT(struct stu_type stu)printf(No.ttNametAgen);printf(%-16ld%st%dn,stu.num,stu.name,stu.age);,【例9-7】,main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti);,2.结构体指针作为函数参数,此用法一般用于结构体数组问题。与基本类型一维数组的情况
17、相同,实现传址调用,参数用法如下:形参:结构体数组或结构体指针变量;实参:结构体数组名或取得数组名首地址的结构体指针变量。,【例9-8】同上例,输出全部学生的信息,#define N 3struct stu_typelong num;char name20;int age;void PRINT(struct stu_type*p)int i;printf(No.ttNametAgen);for(i=0;inum,(p+i)-name,(p+i)-age);main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zha
18、o,20;PRINT(st);,3.返回结构体类型数据的函数,函数返回值可以是结构体类型的值,也可以是指向结构体变量(或数组元素)的指针。当函数返回值是结构体类型的值时,称该函数为结构体类型函数;当函数返回值是指向结构体类型存储单元的指针时,称该函数为结构体类型指针函数。,【例9-9】同【例9-7】,打印学号为20050102学生的全部信息,查找用结构体类型函数实现,#define N 3struct stu_typelong num;char name20;int age;struct stu_type fun(struct stu_type st)int i;for(i=0;iN;i+)i
19、f(sti.num=20050102)return(sti);main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;struct stu_type stu;stu=fun(st);printf(No.ttNametAgen);printf(%-16ld%st%dn,stu.num,stu.name,stu.age);,动态内存分配与链表,1.动态内存分配和链表的概念(1)固定内存分配与动态内存分配的概念 固定内存分配在C语言程序中用说明语句定义的各种存储类型(自动、静态、寄存器、外部)的变量或数组,
20、均由系统分配存储单元,程序员无法在函数的执行部分干预存储单元的分配和释放。这样的存储分配叫固定内存分配,又叫系统存储分配。动态内存分配C语言允许程序员在函数执行部分的任何地方使用动态存储分配函数(本节2.)开辟或回收存储单元,这样的存储分配叫动态内存分配。动态内存分配使用自由、节约内存。利用动态内存分配建立的链表是一种十分重要的数据结构。,(2)链表的概念,结点组成链表的基本存储单元叫结点,该存储单元存有若干数据和指针,由于存放了不同数据类型的数据,它的数据类型应该是结构体类型。在结点的结构体存储单元中,存放数据的域叫数据域,存放指针的域叫指针域,简单结点的形式如图所示。,结点类型定义的一般形
21、式为:struct 类型名数据域定义;struct 类型名*指针域名;,例如有如下结点类型的定义:struct studentint num;float score;struct student*next;,链表 若有一些结点,每一个结点的指针域存放下一个结点的地址,因此就指向下一个结点,这样就首尾衔接形成一个链状结构,称为链表。用上面的结构体类型建立的有4个结点的链表如图所示。,(2)链表的概念,头结点:指向链表中第一个包含有用数据的结点,本身不包含有用数据,用于对链表的访问。尾结点:不指向其他结点的结点。尾结点的指针域存放的地址为NULL(或0,或0)。,(2)链表的概念,相同点:它们均由
22、同类型的存储单元组成。不同点:数组由固定分配的连续的存储单元组成,定义后存储单元不可增加或减少,对数组元素的访问为随机访问。链表可由不连续的存储单元(结点)组成,结点一般为动态分配存储单元,可随时增、删。只能顺序访问链表中的结点。,链表与数组,建立一个简单链表,c.data=15;c.next=NULL;p=head;while(p!=NULL)printf(%d-,p-data);p=p-next;printf(NULLn);,【例9-11】建立一个简单的链表并输出,struct nodeint data;struct node*next;main()struct node a,b,c,*h
23、ead,*p;head=,2.Turbo C 动态存储分配函数,Turbo C动态存储分配函数有:malloc、calloc、free、realloc,这些函数的定义均包含在头文件stdlib.h中。(1)malloc函数void*malloc(unsigned int size)调用形式为:(类型*)malloc(size),例如:int*pi;float*pf;pi=(int*)malloc(2);pf=(float*)malloc(4);,(2)calloc函数void*calloc(unsigned n,unsigned size)调用形式为:(类型*)calloc(n,size),如
24、:char*ps;ps=(char*)calloc(10,sizeof(char);,2.Turbo C 动态存储分配函数,(3)realloc函数void*realloc(void*ptr,unsigned newsize)调用形式为:(类型*)realloc(ptr,newsize),(4)free函数 void free(void*)调用形式为:free(p);其中指针变量p必须是由malloc、calloc、realloc函数分配存储单元存放首地址的指针变量,该函数的作用是收回由p指向的动态分配的存储单元。该函数无返回值。,2.Turbo C 动态存储分配函数,3.动态存储分配链表的基
25、本操作,由包含一个指针域的结点组成的链表为单向链表。,建立并初始化链表遍历访问链表(包括查找结点、输出结点等)删除链表中的结点在链表中插入结点,(1)建立单向链表建立单向链表的步骤如下:建立头结点(或定义头指针变量);读取数据;生成新结点;将数据存入结点的数据域中;将新结点连接到链表中(将新结点地址赋给上一个结点的指针域)。重复步骤,直到输入结束。,3.动态存储分配链表的基本操作,【例9-15】建立带有头结点的单向链表,当输入-1时结束。,#include struct nodeint data;struct node*next;main()int x;struct node*h,*s,*r;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举
链接地址:https://www.31ppt.com/p-6332279.html