




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章结构体与共同体现代教育技术中心2000年5月13日10.1概述迄今为止,我们介绍了简单的数据类型:整形、实型、字符型以及数组指针类型定义的变量,其中,数组中各元素都具有相同的类型。现在,我们要处理一个学生的数据:Name,Age,Sex,Addressetc,如何处理?在数据库中,我们通常要用“记录”来描述一个实体:如学生、教材、……在C语言中,允许程序员自定义类型,这就是结构:structstud{
intnum;charname[20];charsex[2];
intage;charaddress[50];};10.2定义结构类型、变量的方法定义结构体变量通常:定义结构体类型用结构体类型定义结构体变量先定义结构类型、然后定义结构变量在定义结构类型的同时定义结构变量直接定义结构变量一、定义结构类型、定义结构变量定义结构类型:structstudent{
intnumber;charname[20];
intage;charsex[3];charaddress[50];};定义结构类型的关键字定义的结构类型名称是一个C标识符成员列表:域表,成员列表,根据需要而定。定义结构类型、定义结构变量用定义过的结构类型名来定义结构体变量。structstudentstudent1,student2,student3;关键字已经定义过的类型名称。结构变量列表和我们直接使用的intfloatchar类似二、在定义结构类型同时定义结构变量C语言允许在定义结构类型时,定义结构变量。如structstudent{
intnumber;charname[20];
intage;charsex[3];charaddress[50];}student1,student2,student3;关键字结构类型名称结构成员列表结构变量列表三、直接定义结构变量也可以不定义结构类型,而直接定义结构变量。struct{
intnumber;charname[20];
intage;charsex[3];charaddress[50];}student1,student2,student3;五、注意事项结构类型名和结构变量对结构体的引用问题。结构体中的成员和程序中的变量,代表不同的对象,因此可以同名。在结构体中,成员可以是另一个已经定义的结构体类型变量。structdate{
intyear;
intmonth;
intday;};structworker{
intnum;charname[20];charsex[3];
structdatebirthday;charaddress[50];}worker1,worker2,worker3;为结构体变量的成员。10.3结构体变量的引用结构体变量的引用方式:结构体变量.成员如:student1.numberscanf(“%d”,&student1.number);printf(“%d”,student2.number);对成员的引用,和简单变量一样,要注意其类型。scanf(“%d”,&student2.number);scanf(“%s”,);成员运算符
student1.num=12345;
strcpy(student2.address,”XiamenCity”);注意:不能将结构体变量整体输入、输出。printf(“%d,%s,%s,%d,%s\n”,student1);引用时,必须是基本类型(int、float、char)的成员,如果不是,应继续引用“成员运算符”。如:worker1.birthday.year=1973;worker1.birthday.month=8;基本类型的成员可以象普通变量一样进行各种运算。worker1.birthday.year++;--worker1.birthday.month;
可以直接引用结构体成员的地址。
scanf(“%d”,&worker2.birthday.day);10.4结构体变量的初始化结构体变量和简单变量一样,根据定义的位置不同,有:外部、自动存储类型。外部变量静态存储变量自动变量动态存储变量同样,结构体变量也有这些存储类型。外部存储类型的结构体变量直接进行初始化。例10.1structstudent{
intnum;charname[20];charsex;charaddress[40];}stu1={12345,”LiLin”,’M’,”123BejingRoad”};main(){printf(“No.:%d\nName:%s\nSex:%c\nAddress:%s\n”,stu1.num,,stu1.sex,stu1.address);}对静态存储类型的结构体变量进行初始化main(){staticstructstudent{
intnum;charname[20];charsex;charaddress[40];}stu1={12345,”LiLin”,’M’,”123BeijingRoad”};printf(“\tNo.:%d\n\tName:%s\n\tSex:%c\n\tAddress:%s\n”,stu1.num,,stu1.sex,stu1.address);}10.5结构体数组结构体数组的定义:structst{
intnum;charname[20];charsex;floatscore;};structststudent1[10];structst{intnum;charname[20];charsex;floatscore;}student1[10];struct{intnum;charname[20];charsex;floatscore;}student1[10];结构体数组的初始化:structst{
intnum;charname[20];charsex;floatscore;};staticstructststudent1[3]={{12345,”LiLin”,’M’,98},{12346,”ZhangHong”,’F’,70},{12347,”WangTing”,’M’,89}};
定义时进行初始化,可以不给定元素个数。
ex10-0210.6指向结构体类型数据的指针变量结构体变量在内存中也占据一定得空间,因此结构体变量也有起始地址,这就是结构体指针.可以定义一个指针变量来存放结构体的起始地址--结构体指针变量.我们知道:定义指针变量是有类型的,指向结构体的指针变量必须定义成结构体对应的类型!一、指向结构体变量的指针定义结构体变量的指针变量的步骤:定义结构体的类型定义结构体变量、和指针变量对结构体的指针变量进行初始化用初始化的指针变量访问结构体变量。ex10-03使用指针变量引用结构体的成员时,应使用如下格式:由于成员运算符比指针运算符的优先级更高,如果写成:*p.num**p.sex*p.score则相当于*(p.num)*()……,因此应写成:(*p).num(*p).name(*p).sex(*p).score为了简化写法,把上述写成:p->nump->namep->sexp->score其中:“->”叫指向运算符。ex10-031二、指向结构体数组的指针前面已经介绍结构体指针和结构体数组。结构体数组的元素可以用指针或指针变量来指向、进行引用。ex10-04structstudent{
intnum;charname[20];charsex;intage;};structstudentstu[3]={{10101,”LiLin”,’M’,18},{10102,”Zhanghua”,’M’,19},{10103,”Wangpin”,’F’,20}};main(){structstudent*p;
printf(“No.NameSexAge\n”);for(p=stu;p<stu+3;p++)
printf(“%5d%-20s%2c,%4d”,p->num,p->name,p->sex,p->age);}注意:
p定义成结构体student的指针变量,因此:
p++
指向的是结构体数组的下一个元素,而不是结构体的下一个成员。101011010210103
Lilin
Zhanghua
Wangpin
M
M
F181920
p++
p++由于定义的是指向结构体的指针,因此它只能指向结构体,而不能指向结构体的成员。如p=&stu[0].age是错误的。如果一定要指向一个非结构体数据,则可以使用强制类型转换。
p=(structstudent*)&stu[0].age;
等等。三、用指向结构体的指针作为函数的参数要把结构体变量的值由一个函数传递给另一个函数(标准C):
用结构体的成员作为函数的参数。把结构体成员的数值传递给形参。用指向结构体变量的指针作为实参,将结构体变量的地址传递给形参。ex10-0510.7链表所谓“链表”是一种自带有指向本结构体变量的成员的一种结构体。
NULL可见:在链表中的每一节,至少要包含一个指向下一节的指针。链表结构体类型的定义例如:
structstudent{
intnum;charname[20];floatscore;
structstudent*np;}使用链表动态分配内存函数:
malloc(size)在内存中分配一个大小为size的空间。calloc(n,size)在内存中分配n个大小为size的空间。free(p)释放有指针p指向的内存空间。注意:malloc()和calloc()函数返回的是
void*型的指针,必须用强制类型转换成对应的类型。10.8共用体一、共用体的概念在C语言中,一个变量一旦定义,便在内存中开辟一个独立的单元来存放。但在实际使用中,有时需要把不同类型,如整型、实型、字符型存放在同一个内存单元中。这种使几个不同的变量共同占用同一个内存单元的结构,叫“共用体”或“联合体”。共用体的定义:共用体和结构体变量的定义类似,也可以分成三种方式:union共用体类型名{成员列表}共用体变量列表;例如:
unionexdata{inti;charch;floatf;}a,b,c;或:
unionexdata{inti;charch;floatf;};unionexdataa,b,c;或:
union{inti;charch;floatf;}a,b,c;
i
ch
f1200地址共用体和结构体的区别:结构体变量所占用的内存是所有成员的长度之和。各个成员有其自己的内存。共用体所有的成员占用“同一”内存。所需的内存:最大成员的长度。二、共用体变量的引用共用体的引用:不能直接引用共用体变量,只能引用共用体变量中的成员。例如:a.i=9;/*引用变量a的整型部分*/a.ch=‘H’;/*引用变量a的字符型部分*/a.f=3.14;/*引用变量a的实型部分*/printf(“%d\n”,a.i);三、注意事项:同一个共用体变量每一瞬时只能保存一个成员,一个成员起作用。当保存一个成员的值,原先保存的值就丢失。各成员的起始地址一样。共用体变量可以出现在结构体中,结构体也可以出现的共用体中。10.9枚举类型所谓“枚举”是指将变量的值一一列举出来,变量只限于列举出来的值中取值。枚举类型定义:
enum枚举类型{枚举值列表};枚举变量定义:
enum枚举类型枚举变量列表;例如:
enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayworkday,week_end;workday=mon;week_end=sat;定义了两个枚举型变量workday,week_end为枚举变量赋值!说明:在C中,对枚举元素按常量处理,也叫“枚举常量”。如果不进行任何设定,第1个元素值为0,第2个为1,……也可以改变枚举元素的值,如enumweekday{sun=7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脱贫攻坚通报管理制度
- 私人飞机机场管理制度
- it外包方管理制度
- 中小学班级管理制度
- 幼儿绘本室管理制度
- 介入科医院管理制度
- 离校学生安全管理制度
- 中石油合同管理制度
- 皮草生产车间管理制度
- 绿色生态茶园管理制度
- 部编版七年级历史(下)材料论述题专项训练
- 年产1000吨乳酸的生产工艺设计
- 博克服装CAD制版说明操作手册(共95页)
- 南开中学小卷数学模拟试卷(共3页)
- 光电效应测普朗克常数-实验报告
- (完整word版)数据模型与决策课程案例分析
- 自制桁架移动式操作平台施工方案
- 物业服务参与校园文化建设及举办大型活动配合措施
- 太阳能LED路灯项目实施方案
- 调岗调薪实操指引PPT课件
- 福清核电厂辐射防护生产准备实践
评论
0/150
提交评论