[工学]c11结构体、联合体与枚举类型_第1页
[工学]c11结构体、联合体与枚举类型_第2页
[工学]c11结构体、联合体与枚举类型_第3页
[工学]c11结构体、联合体与枚举类型_第4页
[工学]c11结构体、联合体与枚举类型_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第十一章 结构体、联合体 与枚举类型,1 结构体的概念,2 结构体数组,3 结构体指针,5 联合体数据类型,本章内容,4 链表,6 枚举数据类型,7 自定义数据类型,1 结构体的概念,结构体类型是一种构造的数据类型,是数目固定,类型不同的若干有序数据项的集合。每一个数据项称为一个成员,每一个成员可以是一个基本数据类型或一个构造类型。C语言中并不提供现成的结构体类型,在使用前必须先自己定义,一、结构体类型的定义,struct 结构体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; ;,一、结构体类型的定义,struct student int num; char name10; char sex; int age; char addr50; int score; ;,struct date int year; int month; int day; ;,二、结构体变量的定义、引用、初始化,结构体变量的定义,先定义结构体类型,再定义结构体变量struct 结构体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; ;struct 结构体类型名 结构体变量名表列;,(1),struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu1,stu2;,(1)先定义结构体类型,再定义结构体变量,结构体变量的定义,可以用符号常量代表一个结构体类型#define STUDENT struct studentSTUDENT int num; char name10; char sex; int age; char addr50; int score; ;STUDENT stu1,stu2;,结构体变量的定义,定义结构体类型的同时定义结构体变量struct 结构体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; 结构体变量名表列;,(2),struct student int num; char name10; char sex; int age; char addr50; int score; stu1,stu2;,(2)定义结构体类型的同时定义结构体变量,直接定义结构体变量struct 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; 结构体变量名表列;,(3),结构体变量的定义,struct int num; char name10; char sex; int age; char addr50; int score; stu1,stu2;,(3)直接定义结构体变量,2.结构体变量的引用,结构体变量是由若干个不同类型数据的成员组成的集合。对结构体变量的引用一般是通过结构体变量的成员来实现的,具有相同数据类型的结构体变量也可以相互赋值结构体成员引用的一般形式: 结构体变量.成员名结构体成员的使用方法与同类型的普通变量一样,可以对它们进行各种运算,二、结构体变量的定义、引用、初始化,struct student int num; char name10; char sex; int age; char addr50; int score; stu1,stu2;,2.结构体变量的引用,stu1.num=1422;strcpy(,Lin Hui);stu1.sex=M;stu1.age=18;strcpy(stu1.addr,Shang Hai);stu1.score=85;stu2=stu1;,输入输出结构体成员值时,只能对各成员分别操作,3.结构体变量的初始化,struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu=1422,Lin Hui,M,18,Shang Hai,85;,结构体变量初始化:各成员的值用一对大括号括起来,括号内各数据项的数据类型、顺序要和结构体类型说明中的成员类型匹配,各值用逗号分开。如部分初始化,其余值为0或NULL,三、结构体的嵌套,定义结构体时,如其成员的类型也是结构体类型,则构成结构体的嵌套定义,并且它的嵌套定义可以是多重的。,struct dateint year;int month;int day;,struct addresschar city50;char street50;int streetnum;,struct employeeint num;char name10;char sex;struct date birthday;struct address addr;,三、结构体的嵌套,引用嵌套的结构体时应按照从左到右,从外到内的方式,用“.”一级一级地运算,直到找到最低一级的成员,struct employee emp;emp.num=1001;strcpy(,Liu Xiaomei);emp.sex=F;emp.birthday.year=1986;,三、结构体变量作函数参数,结构体变量作函数参数同普通变量一样,函数调用时给形参结构体变量分配另外的存储空间,然后将实参结构体各成员的值依次传递给形参各成员,实参与形参也是单向值传递例:结构体变量作函数参数,当结构体类型较复杂时,这种传递各成员值的方式要花费较多的时间并占较大的空间,程序运行效率较低在实际应用中较多的使用结构体数组或结构体指针作函数参数,2 结构体数组,一、结构体数组的定义,struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu40;,struct student int num; char name10; char sex; int age; char addr50; int score; stu40;,struct int num; char name10; char sex; int age; char addr50; int score; stu40;,一、结构体数组的定义,二、结构体数组的初始化,struct student int num; char name10; char sex; int age; char addr50; int score; ;,struct student stu2= 6001,Zhao zhen,F,18,Beijing,85, 6002,Lin ping,F,19,Shanghai,70;,三、结构体数组的引用,结构体数组的引用同基本类型的数组一样,只能逐个引用结构体数组的数组元素,其下标从0开始,每个数组元素的使用方法和同类型的结构体变量一样。具有相同类型的各个数组元素之间可以相互赋值,但输入、输出、运算大部分操作是通过结构体数组元素的成员来实现的。访问结构体数组元素的成员格式为: 结构体数组名下标.成员名例:stu0.num stu0.score,P236例11.3,3 结构体指针,结构体变量的指针:结构体变量的首地址结构体指针变量:指向结构体变量的指针变量结构体指针变量的定义形式: struct 结构体类型名 *结构体指针变量名结构体指针变量同其它指针变量一样也必须先赋值后才能使用,一、指向结构体变量的指针,struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu,*pstu;pstu=,一、指向结构体变量的指针,一、指向结构体变量的指针,定义了结构体指针变量后,就可以通过指针引用结构体成员,形式如下: (*结构体指针变量).成员名; (*pstu).num=6001;也可以用指向运算符“-”来访问结构体成员,形式如下: 结构体指针变量-成员名 pstu-num=6001;,P238 例11.4,二、指向结构体数组的指针,psstu,ps+1stu+1,struct student stu2;struct student *ps;ps=stu; 或 ps=+ps-num +(ps-num)(+ps)-num(ps+)-num,三、结构体指针作函数参数,结构体指针变量作函数参数,函数调用是由实参向形参传递的只是地址值指向结构体的指针作函数的形参,其对应的实参为相同结构体类型指针或结构体变量的地址。在被调函数中可通过改变形参指针指向的结构体变量的值来改变实参的值,例:结构体指针作函数参数,4 链表,静态数据结构:数组动态数据结构:占用的存储空间在程序运行期间可以动态地变化,能根据数据存储需要而扩充或缩减,能方便地增加或删除其元素,如链表、树、图等,一、链表的概念,链表是一种重要的数据结构,它是动态地进行存储分配的一种结构。它是由n个结点组成的序列,结点间的联系用指针实现,链表中结点由两部分组成:数据域和指针域,每个链表都有一个头指针,指向该链表的起始地址,链表的最后一个结点称为表尾,其指针域为NULL,当头指针为NULL时此链表为空链表,二、内存的动态存储、分配与释放函数,1、动态分配内存空间函数malloc( ) (类型说明符*) malloc(size) 功能:在内存的动态存储区分配一块连续的空间,其长度为size个字节。若分配成功,则返回一个指向所分配内存空间的起始地址的指针;若不成功则返回空指针NULL, (类型说明符*) 表示将返回值强制转换为该类型指针,size为无符号整数 char *pc; pc=(char*)malloc(100),二、内存的动态存储、分配与释放函数,2、动态分配内存空间函数calloc( ) (类型说明符*) calloc(n,size) 功能:分配n块长度为size字节的连续空间 struct node *ps; ps=(struct node*)calloc(2,sizeof(struct node);3、释放内存空间函数free( ) free(void *ptr) ptr:任意类型的指针变量,它指向被释放区域的首地址。被释放区域应为由malloc和calloc函数所分配区域,三、链表的操作,1、链表的建立2、链表的输出3、链表的查找4、链表的删除5、链表的插入,struct stuint num;char name20;float score;struct stu *next;,s-data = e; s-next = p-next; p-next = s;,s,p,链表的插入,链表的删除,q = p-next; p-next = q-next; e = q-data; free(q);,p,q,5 联合体数据类型,联合体类型也是一种构造的数据类型,与结构体类似,是由不同类型的数据成员项组成区别:它们使用内存的方式不同。结构体中各成员占有独立的存储空间,它们同时存在于结构体的整体空间中,结构体变量的总长为各成员的长度之和。联合体各个不同类型成员共用同一存储空间,某一时刻联合体的存储空间中仅存在某一成员的数据,联合体变量的长度为其最长成员的长度,一、联合体类型的定义,union 联合体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; ;,union udata int i; char c; float f; ;,二、联合体变量的定义,union udata int i; char c; float f; ;union udata u;,union udata int i; char c; float f; u;,union int i; char c; float f; u;,三、联合体变量的引用,联合体变量的引用同结构体类似,只能引用联合体变量的成员。形式如下: 联合体变量名.成员名 (*指向联合体变量指针名).成员名 指向联合体变量指针名-成员名例:union udata u,*pu; 1、u.c=A; u.i=23; u.f=15.6; 2、pu=,6 枚举数据类型,枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围如果有变量只有几种可能的值就可以将其定义为枚举类型。形式如下:enum 枚举名枚举分量名1,枚举分量名2,枚举分量名n,;例:enum weeksun,mon,tue,wed,thu,fri,sat; enum weeksun=7,mon=1,tue,wed,thu,fri,sat;,一、枚举类型的定义,二、枚举变量的定义和引用,1、先定义类型,再定义变量enum weeksun,mon,tue,wed,thu,fri,sat;enum week day1,day2;2、定义类型的同时定义变量enum weeksun,mon,tue,wed,thu,fri,satday1,day2;3、直接定义变量enumsun,mon,tue,wed,

温馨提示

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

评论

0/150

提交评论