程序设计基础(C语言版)课件 第9章 结构体与其他构造类型_第1页
程序设计基础(C语言版)课件 第9章 结构体与其他构造类型_第2页
程序设计基础(C语言版)课件 第9章 结构体与其他构造类型_第3页
程序设计基础(C语言版)课件 第9章 结构体与其他构造类型_第4页
程序设计基础(C语言版)课件 第9章 结构体与其他构造类型_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第9章结构体、与其他构造类型9.1结构体9.2共用体9.3枚举类型9.4类型定义符typedef本章主要内容9.5链表9.1.1结构体类型的定义1.结构体的定义概念声明一个结构类型的一般形式为:struct结构名{ 类型名成员名1; 类型名成员名2;

…… 类型名成员名n;};说明:(1)关键字struct与结构名一起构成结构类型名。(2)大括号中的内容是结构所包括的成员,也叫结构分量。成员的数据类型都可以是基本类型,也可以是结构类型。(3)结构类型定义只是说明了结构类型的构成情况,系统并不分配内存空间。(4)定义结构类型时,不允许将成员的数据类型定义成自身的结构类型,但是结构类型中可以含有指向自身类型的指针变量。(5)C语言把结构声明看做是一条语句,括号后面的分号是不可少的。2.结构体的嵌套定义成员的数据类型也可以定义为结构类型,这样就形成了结构的嵌套。方法一:先定义成员的结构类型,再定义主结构类型structdate{intmonth;intday;intyear;};structstudent{charnum[15];charname[10];charsex[2];structdatebirthday;

charnation[10];charaddr[20];}stu1,stu2;structstudent{charnum[15];charname[10];charsex[2];structdate{

intmonth;

intday;

intyear;}birthday;charnation[10];charaddr[20];}stu1,stu2;分析:结构体类型structstudent的成员birthday被定义成另一个结构类型structdate,此结构体类型又包括3个成员。结构的嵌套定义使其成员信息被进一步细化,这有利于对数据进行深入的分析和处理。方法二:在主结构类型内部定义成员的结构类型1.结构体变量的定义声明了结构类型后,还需要定义结构变量,以便在程序中引用它。结构变量和其他变量一样,必须先定义后使用。9.1.2结构体变量的定义与使用(1)先定义结构类型,再定义结构变量例如:structstudent{charnum[15];charname[10];charsex[2];structdatebirthday;charnation[10];charaddr[20];}structstudentstu1,stu2;(2)定义结构类型的同时定义结构变量struct结构体名{

结构体成员列表;}变量名列表;structstudent{charnum[15];charname[10];charsex[2];intage;charnation[10];charaddr[20];}stu1,stu2;(3)直接定义结构变量struct{结构体成员列表;}变量名列表;struct{charnum[15];charname[10];charsex[2];intage;charnation[10];charaddr[20];}stu1,stu2;【例】下面关于结构的定义语句,错误的是________。A.structtest{inta;intb;intc;};structtesty;B.structtest{inta;intb;intc;}structtesty;C.structtest{inta;intb;intc;}y;D.struct{inta;intb;intc;}y;2.结构体变量的初始化结构变量在定义的同时也可以进行初始化。结构变量初始化的一般形式是在定义变量的后面加上“={初值表列};”

。【例9-2】学籍管理信息系统的管理员想确定自己定义的结构体能否保存学生的基本信息,通过下面程序验证一个学生基本信息的初始化。#include<stdio.h>intmain(){ structstudent {

charnum[15];

charname[10];

charsex[2];

intage;

charnation[10];

charaddr[20];};structstudentstu1={"2021160601001","张明",'男',19,'汉',"英才街"};printf("学号=%s\n姓名=%s\n性别=%s\n",stu1.num,,stu1.sex);printf("年龄=%d\n",stu1.age);printf("民族=%s\n家庭地址=%s\n",stu1.nation,stu1.addr);return0;}注意:(1)对结构变量初始化时,需要按照其成员出现的顺序对每个成员依次赋值,不能跳过前面的成员给后面的成员赋值,例如下面的用法是错误的。(2)不能在结构内部给成员赋初值,例如下面的用法是错误的。structstudent { charnum[15]="2021160601001"; charname[10]="张明"; charsex="男"; intage=19; charnation="汉"; charaddr[20]="英才街";};除了允许具有相同类型的结构变量相互赋值以外,不能整体引用结构变量,而只能引用结构变量中的成员。结构变量的成员与普通变量一样可以参与各种运算,对结构变量的赋值、存取、运算都是通过引用其成员进行的。3.结构体变量的引用引用结构变量成员的方式为:结构变量名.成员名其中,“.”是成员运算符。在C语言中,成员运算符“.”的优先级高于其他运算符,其结合方向是从左到右。例如,表达式“stul.age++”相当于“(stul.age)++”。注意:(1)可以引用结构变量成员的地址,也可以引用结构变量的地址。scanf("%d",&student1.num); printf("%o",&student1); 结构体变量的地址主要用作函数参数,传递结构变量的地址。不能把结构变量作为一个整体进行赋值、存取或运算。(2)对结构中数组成员的引用也是通过逐个引用数组元素来实现的。对于嵌套结构变量,要使用多个成员运算符引用其最低级的成员。(3)相同类型的结构变量之间可以进行整体赋值,但是不能进行关系运算(4)结构变量可以作为函数的参数或返回值,以便在函数之间传递数据。1.结构体数组的定义可以将数组定义为结构类型,即结构数组结构数组用来表示具有相同数据结构的一个群体,可以使用循环对数组元素进行统一处理,优化算法。9.1.3结构体数组的定义与使用(1)先声明结构类型,再定义结构数组struct结构名{ 成员列表;};struct结构名数组名[元素个数];(2)声明结构类型的同时定义结构数组struct结构名{ 成员列表;}数组名[元素个数];(3)直接定义结构数组struct{ 成员列表;}数组名[元素个数];2.结构数组的初始化结构数组初始化的一般形式为:struct结构名数组名[元素个数]={初值表列};例如:structstudentstu[5]={"2021160601001","张明","男",21,"汉","英才街","2021160601002","李承","男",20,"汉","文化路","2021160601003","赵彤","女",19,"汉","花园路"};通常会使用大括号将所有的数组元素初始值括起来。在编译时系统会将第一个大括号中的数据赋给数组stu的第一个元素,第二个大括号中的数据赋给第二个元素,依次类推。structstudentstu[5]={{"2021160601001","张明","男",21,"汉","英才街"},{"2021160601002","李承","男",20,"汉","文化路"},{"2021160601003","赵彤","女",19,"汉","花园路"}};3.结构体数组的引用结构数组元素成员的引用可以有如下几种形式:(1)结构数组名[下标].成员名(2)(*(结构数组名+下标)).成员名(3)(结构数组名+下标)->成员名。其中:形式(2)中最外面的括号不可少形式(3)中的“->”称为指向成员运算符,其优先级与成员运算符“.”相同,且结合方向均为从左到右。结构数组元素成员的使用方法与同类型的结构变量相同。1.结构体指针的定义指向结构变量的指针叫做结构指针。结构指针变量的值是它所指向的结构变量所占用内存空间的起始地址。结构指针变量定义的形式为:struct结构名*指针变量名;9.1.4结构体指针的定义与使用访问结构变量的成员的形式等价:(1)结构变量名.成员名(2)(*结构指针变量名).成员名(3)结构指针变量名->成员名2.结构体指针的使用引用结构体变量成员可以有以下三种形式:

结构体变量名.成员名(*结构体指针变量名).成员名

结构体指针变量名->成员名stu1.age:得到结构体变量stu1的成员age的值。(*p).age:得到p指向的结构体变量stu1的成员age的值。(*q).age:得到q指向的结构体数组stu第一个元素stu[0]的成员age的值。p->age:得到p指向的结构体变量stu1的成员age的值。q->age:得到q指向的结构体数组stu第一个元素stu[0]的成员age的值。p->age++:得到p指向的结构体变量stu1的成员age的值,然后使成员age的值加1。q->age++:得到q指向的结构体数组stu第一个元素stu[0]的成员age值,成员age值加1。++p->age:等价于++(p->age),使得p指向的结构体变量stu1的成员age的值加1。++q->age:等价于++(q->age),使得q指向结构体数组stu第一个元素stu[0]成员age值加1。(++q)->age:先使得q自加1,指向结构体数组stu第二个元素stu[1],其成员age值。(q++)->age:先得到q->age的值,然后使得q指向的结构体数组stu第二个元素stu[1]。结构指针也可以用来指向一个结构数组,这时结构指针的值是结构数组的首地址。同样,结构指针变量也可以指向结构数组元素,此时结构指针变量的值是结构数组元素的地址。3.指向结构数组的指针给出以下结构体数组与结构体指针的定义:structteacher{ charno[13]; charname[10]; intage; };structteacherteach[5],*p;p=teach;p指向数组teach的第一个数组元素,“p=teach;”与“p=&teach[0];”等价,如果“p++”,则指针变量p指向teach[1]。结构指针作为函数的参数,要求对应的形参是一个同类型的结构指针由于指针中存放的是地址,因此实参指针和形参指针实际指向同一个地址,则在被调用函数中对形参的修改会影响相应实参的值。4.结构指针作为函数参数参考教材中示例。【例9-8】学生信息管理系统的管理员,对输入的学生成绩信息进行修改。共用体,也叫联合体,是一种用户自定义的构造数据类型,它使几个不同类型的变量共占同一段内存。共用体实质上是采用了覆盖技术,使几个变量互相覆盖。9.2共用体9.2.1共用体类型和共用体变量的定义1.共用体的定义声明一个共用体类型的一般形式为:union共用体名{ 类型名成员名1; 类型名成员名2;

…… 类型名成员名n;};方法一:先声明共用体类型,然后再定义共用体变量unionSC{intscore;charnotes[10];};unionSCx1,x2;2.共用体变量方法二:声明共用体类型的同时定义共用体变量unionSC{intscore;charnotes[10];}x1,x2;方法三:直接定义共用体变量union{intscore;charnotes[10];}x1,x2;对于共用体变量成员的引用也是通过成员运算符“.”进行的,引用方式为:共用体变量名.成员名

例如:x1.Score,x1.notes共用体和结构可以嵌套使用,即结构中的成员可以是共用体,共用体中的成员也可以是结构。引用内部成员的方式如下:

结构变量.共用体变量.成员

共用体变量.结构变量.成员9.2.2共用体变量的引用对共用体变量的使用要注意下面几个问题。(1)共用体成员所占用的存储空间虽然可以存放不同类型的数据,但是在程序运行的某一个时刻只有一个成员值有效。(2)引用共用体变量时,要保证其存储类型的一致性,即最近一次存入共用体变量中的是一个整数,那么下一次取出该变量中的内容也应该是一个整数。(3)只能对共用体变量的第一个成员初始化,不能同时对共用体变量的所有成员进行初始化。1.枚举类型声明一个枚举类型的一般形式为:enum枚举名{ 枚举值列表 };(1)关键字enum是枚举类型的标志,“enum枚举名”构成枚举类型。(2)枚举是一个集合,集合中的元素(称为枚举成员或枚举常量)是一些特定的标识符,元素之间用逗号隔开。(3)在枚举类型中,枚举成员是有值的,第一个枚举成员的默认值为0,后续成员的值依次递增。(4)枚举成员是常量,不能对它们赋值。如“red=1;”是错误的。但是在定义枚举类型时可以指定枚举成员的值。(5)同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员。

9.3枚举9.3.1枚举类型的定义2.枚举变量声明了枚举类型后,可以使用它来定义枚举变量,有以下三种形式:形式一:先定义枚举类型,然后定义枚举变量enumcolor{red,yellow,green,blue,black};enumcolorc1,c2;形式二:定义枚举类型的同时定义枚举变量enumcolor{red,yellow,green,blue,black}c1,c2;形式三:直接定义枚举变量enum{red,yellow,green,blue,black}c1,c2;1.枚举类型数据的输入输出枚举类型的数据不能直接进行输入输出。输入时应先输入其序号,然后使用强制类型转换完成;输出时应先进行转换才能输出其对应的字符串。9.3.2枚举类型的使用2.枚举类型数据的关系运算同一种枚举类型的数据可以进行关系运算。比较时是对其序号进行比较。C语言允许用户为数据类型取“别名”,类型定义符typedef可用来实现此功能。使用typedef定义类型说明符的格式为:typedef类型标识符别名;其中,类型标识符可以是C语言中的基本数据类型或者是构造数据类型。9.4类型定义符typedef使用typedef定义类型的步骤如下:(1)按定义变量方法写出定义体,如:inti;(2)将变量名换成新类型名,如: intINTEGER;(3)最前面加typedef,如: typedefintINTEGER;(4)用新类型名定义变量,如:INTEGERi,j;链表是一种动态数据结构,它使用随机分配的内存单元来存放数据,这些内存单元可以是连续的,也可以是不连续的。

温馨提示

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

评论

0/150

提交评论