




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章结构体与共用体结构体(struct)共同体(union)结构体与共用体小结枚举类型(enum)typedef定义类型【教学内容】结构体(struct)
结构体是一种构造数据类型,它是由若干成员组成的。每一个成员都可以是一个基本数据类型或者一个构造数据类型。结构体类型的定义、结构体变量的定义、结构体变量的存储特点、结构体变量的引用及初始化
如果一个数组中的元素都是结构体类型的数据。则构成了结构体数组。结构体数组的定义、初始化、应用举例一个结构体变量在内存中占用一段连续的内存空间,可以定义一个指针指向这个结构体变量,此时,该指针指向结构体变量的起始地址。指向结构体变量的指针
指向结构体数组的指针指向结构体的指针作函数的参数
用指针处理单链表结构体类型的定义1、定义一个结构体类型的一般形式为:struct结构体名{成员说明表列;};2、功能:用于描述一个“概念”。(或记录)如:numnamesexscoreaddr10010LiHuiM87.5BeiJing说明要点:(1)struct是定义结构体类型的关键字,结构体名是由编程者按C语言规定的标识符规则指定的。
(2)成员说明表列由若干成员组成,每个成员都是该结构体的一个组成部分,对每个成员也必须作类型声明。声明格式同一般变量的说明:成员名的命名规则符合C语言标识符的规定。(3)最后一个花括弧的分号不能省略。到此为止是编程者指定的一个新的结构体类型。structstudent{intnum;/*学号*/charname[20];/*姓名*/charsex;/*性别*/floatscore;/*成绩*/charaddr[30];/*住址*/};(4)结构体类型可以嵌套定义,即一个结构体类型中的某些成员又是其他的结构体类型,但是这种嵌套不能包含自身,即不能自己定义自己。定义一个出生年月的结构体类型如下:structdate{ intyear; intmonth; intday;};structstudent{intnum;charname[20];charsex;floatscore;charaddr[30];structdatebirthday;/*birthday是structdate类型*/};5
结构体类型的定义相当于基类型中的int、char、float等一样,系统并未对它分配内存单元,只有将某一变量声明为这种类型,系统才为该变量分配具体的内存单元。结构体类型变量的定义1.先定义结构体类型,再定义结构体变量
struct结构体名变量名列表;例如:structstudentstudent1,student2;结构体类型名变量名1变量名2注:可以用宏定义来简化结构体类型的书写,定义好结构体类型变量之后,系统才会根据其包含成员的具体类型为它分配内存单元。2.定义结构体类型的同时声明结构体变量struct结构体名{成员说明表列;}变量名表列;structstudent{intnum;charname[20];charsex;floatscore;charaddr[30];structdatebirthday;}student1,student2;3.直接定义结构体类型变量其一般形式为:struct{成员说明表列;}变量名表列;struct{intnum;charname[20];charsex;floatscore;charaddr[30];structdatebirthday;}student1,student2;7关于结构体类型,作如下几点说明:(1)结构体类型与结构体变量是不同的概念。系统并不为结构体类型分配具体的内存单元,不能对一个结构体类型进行操作(如赋值、存取或运算),但是为变量分配内存单元并可以进行相应的操作。(2)结构体变量中的成员可以单独使用,它的作用与地位相当于普通变量。(3)成员名与程序中的变量名可以相同,二者不代表同一对象,不会混淆。结构体变量的存储特点如:structstudent{intnumber;charname[5];charsex;intage;floatscore;charaddr[10];}student1,student2;structstudent所占存储空间的大小为:各成员变量所占存储单元字节数之和。sizeof(student)student1.number[0]...[4]student1.sexstudent1.agestudent1.scorestudent1.addr[0]...student1.addr[9]student2.number[0]...[4]student2.sex...student1student2结构体类型变量的引用及初始化三、要点:1.结构体变量不能整体输入输出,只能对它的成员进行操作.如:student1.num;2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成员.只能对最低级的成员进行赋值或存取等相关操作。如:student1.birthday.day3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符.“.”是成员(分量)运算符,它的优先级在所有的运算符中最高.4.可以引用成员的地址.但结构体变量的地址相当于数组的首地址,主要用于函数参数中的地址传递。一、原则:通过结构体的成员来引用结构体变量。二、成员的引用方法为:结构体变量名.成员名;
在初始化时,按照所定义的结构体类型的数据结构,依次写出各初始值,在编译时就将它们赋给该变量中的各个成员。例9-1对结构体变量的初始化。#include"stdio.h"structstudent{intnum;charname[20];charsex;floatscore;charaddr[30];};structstudentstudent1={1001,"zhangsan",'m',78.5,"137ChanganRoad"};main(){printf("学号:%d\n姓名:%s\n性别:%c\n成绩:%f\n家庭住址:%s\n", student1.num,,student1.sex,student1.score,student1.addr);}结构体变量的初始化学号;1001姓名:zhangsan性别:m成绩:78.500000家庭住址:137ChanganRoadPressanykeytocontinue例9-2结构体类型嵌套的初始化。#include"stdio.h"structdate{intyear; intmonth;intday;};structstudent{intnum; charname[20]; charsex; floatscore;structdatebirthday; charaddr[30];};structstudentstudent1={1001,"zhangsan",'m',78.5,2004,3,27,"137ChanganRoad"};main(){printf("学号:%d\n姓名:%s\n性别:%c\n成绩:%f\n出生日期:%d.%d.%d\n家庭住址:%s\n",student1.num,,student1.sex,student1.score,student1.birthday.year,student1.birthday.month,student1.birthday.day,student1.addr);}学号;1001姓名:zhangsan性别:m成绩:78.500000出生日期:2004.3.27家庭住址:137ChanganRoadPressanykeytocontinue12一、定义方法:struct结构体名{
结构体成员定义;
}数组名[元素个数];结构体数组的定义structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];}stu[3];二、结构体数组的使用方法1、通过数组的下标(或指向数组的指针)来访问结构体变量。2、再通过结构体变量的成员实现结构体数据的访问。形式为:数组名[下标].成员名如:stu[2].name=“WangYing”;structstudent{longnumber;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu[3];注:定义和结构体类型相仿,也有三种方式1、含义:在定义结构体数组时完成数组元素的赋值2、方法:同基本类型的数组一样,结构体数组的元素在内存中也按顺序存放结构体数组的初始化structstudent{ intnum; charname[20]; charsex; floatscore; charaddr[30];};structstudentstu[3]={{1001,"zhangsan",'m',78.5,"137ChanganRoad"},{1002,"yangyang",'f',88,"237BeijingRoad"},{1003,"zhangkui",'m',65,"163ChanganRoad"}};#include<stdio.h>#include<string.h>structperson{charname[20];intcount;}leader[3]={"Li",0,"Zhang",0,"Fun",0};main(){inti,j; charleader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;} printf("\n"); for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count);}例9_3:对候选人得票的统计程序.
设有三个候选人,每次输入一个候选人的名字,最后统计出每个候选人的得票的结果.15例9-4统计不及格学生的人数及具体信息,并计算全体学生的平均成绩。#include"stdio.h"structstudent{ intnum; charname[20]; charsex; floatscore;}stu[5]={{1001,"liping",'f',67},{1002,"zhangsan",'m',45},{1003,"hefang",'f',80},{1004,"chenlin",'f',56},{1005,"wangming",'m',86}};解题分析:为方便操作,将学生定义为一个结构体类型。5个学生的数据可以保存在外部结构数组stu中,同时作初始化赋值。程序中设计了两个计数器,分别保存所有学生的总分及不及格的人数。利用for语句逐个累加各学生的成绩(score成员值)并存于累加器s中,如果score值小于60,输出该学生信息,则累加器c加1。16main(){ inti,c=0; floatave,s=0; printf("学号\t姓名\t\t性别\t成绩\n"); for(i=0;i<5;i++) { s=s+stu[i].score; if(stu[i].score<60) { c=c+1; printf("%d\t%s\t%c\t%f\n", stu[i].num,stu[i].name,stu[i].sex,stu[i].score); } } ave=s/5; printf("不及格人数共有%d个.\n",c); printf("所有学生的平均成绩是:%f\n",ave);}学号 姓名 性别成绩1002 zhangsan m 45.0000001004 chenlin f56.000000不及格人数有2个.所有学生的平均成绩是:66.800000Pressanykeytocontinue指向结构体变量的指针二、要点:1、结构体指针变量也必须先赋值后使用。赋值是把结构体变量的首地址赋给该指针,而不是把结构体类型名赋给该指针。2、有了结构体指针变量,访问结构体变量各成员的方法有如下三种:
①结构变量.成员名
②(*结构指针变量).成员名
③结构指针变量->成员名一、定义的一般形式为:struct结构体名*指针变量名比较:1、结构体变量的指针:指结构体变量所占内存单元的起始地址2、指向结构体变量的指针指向结构体变量的起始地址的指针变量.#include"stdio.h"structstudent{intnum;charname[20];charsex;floatscore;}student1={1001,"liping",'f',67};main(){structstudent*p;p=&student1;/*p=&student;×*/printf("学号:%d\t姓名:%s\t性别:%c\t成绩:%f\n", student1.num,,student1.sex,student1.score);printf("学号:%d\t姓名:%s\t性别:%c\t成绩:%f\n",
(*p).num,(*p).name,(*p).sex,(*p).score);printf("学号:%d\t姓名:%s\t性别:%c\t成绩:%f\n", p->num,p->name,p->sex,p->score);/*“->”指向运算符*/}例9-5指向结构体类型变量的指针的应用19#include"stdio.h"structstudent{ intnum; charname[20]; charsex; floatscore;}stu[5]={{1001,"liping",'f',67},{1002,"zhangsan",'m',45},{1003,"hefang",'f',80},{1004,"chenlin",'f',56},{1005,"wangming",'m',86}};main(){structstudent*p;printf("学号\t姓名\t\t性别\t成绩\n");for(p=stu;p<stu+5;p++)printf("%d\t%s\t%c\t%f\n",p->num,p->name,p->sex,p->score);}例9-6指向结构体数组的指针变量的应用。指向结构体数组的指针
用指针访问结构体数组中的元素比用下标访问更为方便灵活,当用结构体指针变量指向一个结构体数组时,这时指针的值是整个结构体数组的首地址。20程序说明:(1)程序中p的初值为stu,即指向第一个元素,则p+1后p就指向下一个元素的起始地址。注意区分:(++p)->num表示先使p自加1,然后得到它指向的元素的值(即1002)。(p++)->num则表示先得到p所指向的元素的值(即1001),然后使p自加1,指向下一个元素。(2)stu+i、p+i和&stu[i]意义相同,均表示数组第i个元素的地址。(3)一个结构体指针虽然可以用来访问结构体变量或结构体数组元素的成员,但却不能使它指向一个成员。上例中如写成:p=&stu[1].name;则是错误的。因为程序中的p被定义为指向结构体类型,所以此时不能将&stu[1].name(字符型)的地址赋给p。但可以通过强制类型转换将成员地址转换成结构体类型,例如:p=(structstudent*)stu[1].name;此时,p的值是stu[1]元素的name成员的起始地址,可用”printf(“%s”,p);”输出stu[1].name的值。但此时p的类型仍然是指向结构体类型,所以p+1则会跨过一个结构体数组元素的长度,指向stu[2].name的起始地址。21用结构体变量和指向结构体的指针作为函数参数1.结构体变量的成员作函数的参数与普通变量作函数参数的用法相同。参数传递属于“值传递”方式,应当注意实参与形参的类型保持一致。2.结构体变量作函数参数新的ANSIC标准允许用结构体变量在函数参数,即直接将实参结构体变量的各个成员的值全部传递给形参结构体变量。当然,实参和形参的结构体变量类型应当完全一致。3.结构体指针作函数的参数用指向结构体的指针作函数参数时,参数传递采用“地址传递”,传送的是结构体的地址,主调函数可以使用被调函数中形参改变了的值。仍需注意实参与形参是同类型的结构体变量的地址。22用指针处理单链表一、链表的含义:由若干个数据组(每一个数据组称为一个“结点”)按一定的原则连接起来的一种结构。举例:二、功能:根据需要开辟内存单元,还可以回收废弃的内存单元。1.malloc(size):在内存中动态的分配一个长度为size的连续空间;2.calloc(n,size):在内存中分配n个长度为size的连续空间;3.free(ptr):释放由ptr指针指向的内存区域.二、链表操作建立链表、在链表插入结点、删除链表结点单链表的结构:structstudent{intnum;floatscore;
structstudent*next;};headnumscorenext
numscorenext
numscoreNULL
...节点要点:1、链表中的元素在内存中存放顺序是不连续的。由next指针来连接各节点。2、链表数据结构的实现,必须利用指针变量.24建立含n个节点的链表过程:
在链表中插入结点的过程...malloc()malloc()headnumscorenext
numscorenext
numscoreNULL
numscorenext
malloc()26删除链表结点的过程:free()headnumscorenext
numscorenext
numscorenext...共同体(union)
共同体的含义与定义方法
共同体的存储特点
共同体的使用共同体的含义与定义方法一、含义:
几个不同变量共同占用同一块内存空间,只是一种覆盖技术,所谓的共同占用是指这几个变量共同拥有内存的同一个起始地址.共用相同的存储单元。例如:uniondate{inti;charch;floatf;}a,b,c;二、定义形式:
union共用体名
{成员表列;
}变量表列;1000100110031002chif共同体的存储特点1.同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;2.共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的成员的地址是同一个地址;4.共用体变量不能整体被赋值,也不能给共用体变量赋初值;5.不能把共用体变量作为函数的参数进行传递,但可以使用指向共用体变量的指针作为函数的参数;6.结构体类型和共用体类型可以嵌套使用.a.i/a.ch/a.fb.i/b.ch/b.fc.i/c.ch/c.fabc例如:uniondate{inti;charch;floatf;}a,b,c;共同体的使用例9-7:已知字符“0”的ASCII码为十六进制的30,下面程序的输出为:#include<stdio.h>main(){ union { unsignedcharc; unsignedinti[4]; }z; z.i[0]=0x39; z.i[1]=0x36; printf("%c\n",z.c);}0011011000000000i[1]?...i[2]0011100100000000i[0]c的地址i[0]的低位地址运行结果:9(ASCII码57所对应的字符)例:下列程序的运行结果是什么?
main()
{unionzj
{inta;
charch[2];}au;
au.a=298;
printf("%d\n%d\n",au.ch[0],au.ch[1]);}421Pressanykeytocontinue结构体与共用体小结一、共同点:都是不同类型数据的集合二、不同点:1、结构体中各个成员均在内存中存在,而共同体中只有一个成员存在于内存中。2、结构体占用的存储空间是所有成员所占空间的和;=sizeof(结构体名)而共用体所占内存空间的大小是所有成员中占用存储空间最大的一个成员的占用空间的值。3、结构体中各个成员相互独立、互不干扰,共同体中改变一个成员的值,会影响到其它成员的值。4、结构体与共同体可以互为成员。枚举类型1、含义:“枚举类型”是将变量的取值一一列举出来,变量的取值范围只限于列出来的值的范围内.2、定义方法:
enum枚举类型名{枚举值列表};
例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayday1,day2;day1=mon;day2=thu;3、使用要点:4、应用举例几点说明:(1)enum是关键字,标识枚举类型,定义枚举类型必须以enum开头。(2)在定义枚举类型时花括弧中的名称称为元素或枚举常量。它们是程序设计者自行指定的,命名规则与标识符相同。这些名称并无固定的含义,只是一个符号,程序设计者只是为了提高程序的可读性才使用这些名称。(3)枚举元素是常量,不是变量。不能在程序中用赋值语句再对它赋值。(4)可以在定义类型时对枚举常量指定一个整型值,例如:enumweek{Sun=7,Mon,Tue,Wed,Thu=4,Fri,Sat=6};(5)枚举常量可以进行判断比较。如:
if(day1==Mon)printf(“Mon”);if(day1>Tue)printf(“ItisWed!”);枚举值的比较规则是按其在定义时的顺序号大小进行的。例9-8编写程序,功能是输入当天是星期几,就可以计算并输出n天后是星期几。#include<stdio.h>enumweek{sun,mon,tue,wed,thu,fri,sat};enumweeknd(enumweekw,intn){return((enumweek)(((int)w+n)%7));}
main(){ enumweekw0,wn; /*w0表示当天的星期值,wn表示n天后的星期值*/intn;scanf("%d,%d",&w0,&n);wn=nd(w0,n);if(wn==0)printf("%d天后是星期日.\n",n)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度个人贷款购销合同还款方式
- 二零二五年度公司与员工市场拓展对赌协议
- 2025年度蔬菜大棚承包与物联网技术融合合同
- 二零二五年度国际收养协议书汇编与亲子关系维护策略
- 草金鱼养殖知识培训课件
- 教学有“方”-课程与教学论(山东联盟)知到智慧树章节测试课后答案2024年秋德州学院
- 健身瑜伽学练指南知到智慧树章节测试课后答案2024年秋湖南财政经济学院
- 2025年国家电网有限公司东北分部招聘14人(第一批)笔试参考题库附带答案详解
- 2025年其它新型计算机外围设备合作协议书
- 电力公司物业管理服务方案投标文件(技术方案)
- 2025山东能源集团中级人才库选拔管理单位笔试遴选500模拟题附带答案详解
- CNAS-R03:2023申诉、投诉和争议处理规则
- 四大名著之红楼梦饮食文化
- 医院后勤管理与服务提升方案
- 员工互评表(含指标)
- 2024年浙江省中考社会(开卷)真题卷及答案解析
- 【MOOC】英语口语进阶-南京大学 中国大学慕课MOOC答案
- 时间规划局中文版
- 2024-2030年中国干细胞美容产业竞争格局及投资战略研究报告
- 2024年电力通信设备运检员(技师)职业鉴定考试题库(浓缩400题)
- 【MOOC】地学景观探秘·审美·文化-重庆大学 中国大学慕课MOOC答案
评论
0/150
提交评论