《C语言程序设计》课件ch7_第1页
《C语言程序设计》课件ch7_第2页
《C语言程序设计》课件ch7_第3页
《C语言程序设计》课件ch7_第4页
《C语言程序设计》课件ch7_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

第7章结构体和共用体

在学生登记表中,要描述一个学生的基本情况,就需要记录他的学号、姓名、年龄、性别、成绩、家庭住址等信息,如图7-1所示。这些信息的特点是数据类型各不相同,但是都与同一个实体相关联。

学号

(长整型)姓名

(字符串)年龄

(整型)性别

(字符型)成绩

(长整型)家庭住址

(字符串)图7-1

学生基本情况7.2结构体与结构体类型变量

“结构体”是一种构造类型,是数目固定、类型相同或不同的若干有序变量组成的集合。组成结构体的每个数据称为结构体的“成员”。7.2.1结构体类型的声明struct结构体名{成员列表};structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];};/*分号不能少*/

7.2.1结构体类型的声明说明:(1)sturct是关键字,是结构体类型必不可少的标识符。(2)结构体的名字是用户自己定义的标识符,与变量命名规则相同。(3)大括号“{}”中是组成该结构体的数据项,或称为结构体类型中的成员。(4)结构体成员的数据类型可以是简单类型、数组、指针或已经定义过的结构体等。(5)整个定义以分号结束。7.2.2结构体类型变量的定义定义方法有以下三种:(1)先声明结构体类型再定义结构体变量。structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];};structstudentstu1,stu2;

/*struct不能少*/7.2.2结构体类型变量的定义(2)在定义结构体类型的同时定义结构体变量。structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];}stu1,stu2;定义说明的一般形式为:struct结构名{

结构体成员表列}变量名表列;7.2.2结构体类型变量的定义(3)直接定义结构体类型变量,不出现结构体名。struct{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];}stu1,stu2;定义说明的一般形式为:struct{

结构体成员表列}变量名表列;/*注意这里没有类型名*/7.2.2结构体类型变量的定义说明:1)结构体类型与结构体变量的概念。只能对变量进行操作(赋值、存取或运算),而不能对一个结构体类型进行操作。2)对结构体中的成员可以单独使用,它的作用与地位相当于普通变量。3)结构体的成员也可以是一个结构体变量,从而构成嵌套结构。4)结构体中的成员名可以与程序中的变量名相同,但二者代表不同的对象。

7.2.3结构体变量的初始化对结构体变量可以在定义时初始化。structstudentstu1={20080512,"WenChuan",'m',18,89.5,"SiChuan"};7.2.4结构体类型变量的引用

1.结构体类型变量的引用格式:2.结构体变量的引用规则:(1)不能将结构体变量作为一个整体进行输入和输出。printf("%d,%s,%c,%d,%f,%s\n",stu1.num,,stu1.sex, stu1.age,stu1.score,stu1.addr);结构体变量名.成员名(2)结构体变量中各成员的使用方法与普通的简单类型变量完全相同。

stu1.num=20080512="BeiChuan"stu1.age=18;stu1.score=stu2.scoresum=stu1.score+stu2.scorestu1.num++;7.3结构体数组

1.结构体数组的定义

结构体数组的定义方法和结构体类型变量类似,只需说明它为数组类型即可。(a)structstudent{intnum;charname[20];floatscore;}structstudentstudent1[45];(b)structstudent{intnum;charname[20];floatscore;}student1[45];(c)struct{intnum;charname[20];floatscore;}student1[45];7.3结构体数组2.结构体数组的初始化与其他类型的数组一样,对结构体数组可以初始化。structstudent{intnum;charname[20];floatscore;}a[2]={{1001,"Zhang",85},{1002,"Wang",86}};7.4.1指向结构体变量的指针

1.指向结构体变量的指针及其定义

C语言编译器严格地按照顺序为每个结构体变量的成员递增地分配存储空间。

结构体变量的指针就是这个结构体变量所在存储单元段的起始地址。2.使用指向结构体变量的指针引用结构体变量的成员结构体变量访问的一般形式为:(*结构体指针变量).成员名或:结构体指针变量->成员名例如:(*spoint).num或:spoint->num7.4.2指向结构体数组的指针1)为结构体数组中的元素分配一个连续的存储空间。说明:2)当指针变量指向一个结构体数组,这时结构体指针变量的值是整个结构体数组的首地址。(1)如果p=stu,表示指针p指向结构体数组stu的第1个元素。stu+i和p+i均表示数组第i个元素的地址,stu+i和p+i与stu[i]意义相同。(2)如果指针变量p指向数组的某一个元素,则p++指向下一个元素。(3)一个结构体指针变量虽然可以用来访问结构体变量或结构体数组元素的成员,但是,不能使它指向一个成员。错误的:p=&stu[0].num;7.4.3结构体指针变量作为函数的参数

用法和普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。(2)结构体变量作实参(1)用结构体变量的成员作参数。

这种传送方式要经全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此,一般较少采用这种方法。(3)用指向结构体变量(或数组)的指针作为实参,将结构体变量(或数组)的地址传给形参。

用指针变量作函数参数进行传送,这时由实参传向形参的只是地址,减少了时间和空间的开销。7.4.4结构体与函数的类型

结构体除了可以作为函数的参数外,函数的返回值也可以是结构体变量或是指向结构体变量的指针。当函数的返回值是一个结构体变量时,称该函数为一个结构体类型函数,其一般形式为:struct结构体名函数名(形参表){函数体}7.5链表7.5.1链表的概念

链表是一种常见的重要的数据结构,它是动态地进行存储分配的一种结构。

单向链表

7.5.2动态存储分配

所谓动态链表,就是在程序运行过程中能从无到有地建立链表。

内存管理函数(malloc、calloc和free为)有效利用内存资源提供了手段。7.5.3链表的基本操作(1)建立链表。(2)查找与输出链表中的数据。(3)在链表中插入一个结点。

(4)从链表中删除一个结点。7.6共用体7.6.1共用体的概念和定义一般形式为:union共用体名

{共用体成员表列};共用体变量的定义也有三种形式。(2)在定义共用体类型的同时定义共用体变量。(1)先定义共用体类型,再定义共用体变量。(3)直接定义共用体类型的变量。例如:unionperdata{intclass;charoffice[10];};7.6.2共用体变量的引用一般引用形式为:注意以下几点:(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一种,而不是同时存放几种。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后,原有的成员就失去了作用。(3)共用体变量的地址和它的各成员的地址都是同一地址。共用体变量名.成员名(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,还不能在定义共用体变量时对它初始化。(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。(6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。7.7枚举类型7.7.1枚举的定义与说明一般形式为:枚举变量也可用不同的方式说明:(1)先定义后说明。(2)同时定义说明。(3)直接说明。enum枚举类型名{枚举值表列};

enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdaya,b,c;enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;enum{sun,mon,tue,wed,thu,fri,sat}a,b,c;7.7.2枚举类型变量的赋值与引用枚举类型在使用中有以下规定:(1)C编译时,对枚举元素按常量处理,故称为枚举常量。它们不是变量,因此不能对它们赋值。(2)枚举元素作为常量,它们是有值的,C语言按定义顺序使它们的值为0,1,2,3,…。(3)枚举值可以用来作比较运算。(4)一个枚举变量的值只能是这几个枚举常量之一,可以将枚举常量赋给一个枚举变量,但不能将一个整数赋给一个枚举变量。

(5)枚举常量不是字符串,不能用下面方式输出字符串"sun":printf("%s",sun);

如果想先检查枚举变量a的值,如果是sun,就输出“sun”。if(a==sun)printf("sun")

7.8用typedef定义类型可以给已经存在的系统类型或用户构造的类型重新命名。常用的用户定义类型主要有三种应用:

温馨提示

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

评论

0/150

提交评论