结构体和共用体_第1页
结构体和共用体_第2页
结构体和共用体_第3页
结构体和共用体_第4页
结构体和共用体_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型2结构体概述结构体的引入和一个学生有关的数据:

姓名、性别、学号、年龄、 家庭住址、学习成绩……这些数据项之间关系密切但数据类型不尽相同,若分别定义多个变量,就会割裂这些数据项之间的内在联系。数组???3为了方便处理多个数据项的数据,常把这些关系密切但类型不同的数据项组织在一起,即“封装”起来,并为其取一个名字,在C语言中,就称其为结构体。结构体通常是由不同数据类型的数据项组成,一般也称是由不同成员组成,因此可以说:一个结构体可包含若干成员,每一个成员可具有不同的名字及数据类型。结构体的引入为处理复杂的数据结构提供了有力的手段,也为函数间传递一组不同数据类型的数据提供了方便,特别是对于数据结构较为复杂的大型程序提供了方便。4结构体类型的定义结构体类型和简单类型不同,简单类型是由系统预定义的,如int、float、char,直接可以使用。而结构体类型是根据需要由程序员自行定义,因此在使用之前必须先定义结构体类型。结构体类型定义:struct[结构体名]{类型标识符成员名;类型标识符成员名;…………….};合法标识符可省;无名结构体成员类型可以是基本型或构造型struct是关键字,不能省略注意:这里说的是定义结构体类型而不是变量。5例structstudent{ intnum;charname[20];charsex;intage;floatscore;charaddr[30];};结构体类型定义描述结构的组织形式,不分配内存6说明:(1)

定义一个结构体类型只是描述了此结构体的组织形式,在编译时并不为其分配存储空间,即仅描述此数据结构的形态或者说模型,故不能对定义的一个结构体类型进行赋值、存取或运算。结构体的成员可以是简单变量、数组、指针、结构体或共用体等。(3)结构体类型定义可以放在函数内部,也可以放在函数外部。若放在内部,则只在函数内有效;若放在外部,则从定义点到源文件尾之间的所有函数都有效。(4)结构体成员的名字可以同程序中的其它变量同名,二者不会相混,系统会自动识别它。例如:刚才定义的结构体中,年龄改用生日来描述。

定义结构体:

structdate_type{intyear;intmonth;intday;};这样,关于学生信息的结构体可定义为:structstud_type{……structdate_typebirthday;……};注意:结构体date_type一定要定义在结构体stud_type之前。7结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型8结构体变量结构体变量的定义与初始化1.结构体变量的定义先定义,再引用。一个结构体变量的定义可以有三种方式。9structstud_type{charname[10];longnum;charsex;intage;floatscore;charaddress[10];};structstud_typestudent1,student2;(1)先定义类型再定义变量直观,灵活!10(2)在定义类型的同时定义变量structstud_type{┇}student1,student2;(3)直接定义结构体变量struct{┇}student1,student2;第一种的简略形式。用于结构体类型仅做一次性使用的场合。11说明:(1)

在定义结构体类型时,系统并不分配内存空间,仅当定义结构体变量时,系统才为被定义的每一变量分配相应的存储单元。如上面定义的结构体变量student1、student2在内存中各占33个字节(10+4+1+4+4+10=33);

(2)结构体变量的定义一定要在结构体类型定义

之后或同时进行。(2)

结构体变量的定义一定要在结构体类型定义之后或同时进行,对尚未定义的结构体类型,不能用它来定义结构体变量。例structstudent{ intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr4字节4字节20字节1字节4字节30字节……..例如:对一个教师teacher的结构体类型未作定义,则下面的变量定义 structteacherteah1是错误的;122.结构体变量的初始化所谓结构体变量初始化,就是在定义结构体变量的同时,对其成员变量赋初值。在赋值时应注意按顺序及类型依次为每个结构体成员指定初始值。结构体初始化的一般格式为:

struct结构体类型名结构体变量={初始化值};例

structstudent{charname[20];

intnum;charsex;intage;floatscore;charaddr[30];};

structstud_typestudent1={“wang”,196103,’m’,20,98,”xian”};13说明:(1)初始化数据之间用逗号分隔。(2)

初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0(若成员是指针,则初始化为NULL)。(3)

初始化数据的类型要与相应成员变量的类型一致。不一致将强制类型转换。

(4)初始化时只能对整个结构体变量进行,不能对结构体类型中的某个成员进行初始化赋值。14structdate_type{intyear;intmouth;intday;};voidmain(){

structstud_type

student1={"wang",196103,'m',1978,10,12,98,"Xian"};structstud_type

student2={"liu",196105,'m',1980,9,22,88,"Benjing"};printf("%d",student1.birthday.day);}structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];};15结构体变量的引用

1.对结构体变量成员的引用在C语言程序中,不准许对结构变量整体进行各种运算、赋值或输入输出操作,而只能对其成员进行此类操作。引用结构体变量成员的一般形式:结构体变量名.成员名其中“.”是结构体成员运算符,其优先级别最高,结合性是自左至右。由此对结构体成员就完全可以像操作简单变量一样操作它。16如:对上例定义的结构体变量student1或student2,可作如下的赋值操作:[10]="wang";strcpy(,”wang”)student1.num=196103;student1.sex='m';student1.birthday.year=1978;student1.birthday.mouth=10;student1.birthday.day=12;student1.score=98;还可以如下操作:sum=student1.score+student2.score;scanf(“%s%d”,,&student1.num);printf(“%s%d”,,student1.num);错误正确172.对结构体变量整体的引用结构体变量和简单变量相比,除了上面所述在参加各种运算、赋值或输入输出方式上有所不同外——即是由结构体变量成员完成,其它同简单变量一样,如:(1)可以相互赋值,但注意相互赋值的两个结构体变量必须是同一个结构体类型;如:student1=student2;

(2)可作为函数的形参、实参或函数返回值。18结构体变量作为函数参数结构体变量成员作函数参数结构体变量中的所有成员都可作为函数参数。structstud_type{charname[10];longnum;charsex;}student1;将结构体变量student1的三个成员分别传递给函数func1(),func2(),func3():func1();func2(student1.num);func3(student1.sex);19若需要将成员地址传递给函数,则只需在其前加取地址符“&”。如:func1();func2(&student1.num);func3(&student1.sex);

其中字符数组名name代表其成员地址,故不需要写“&”。202.结构体变量整体作函数参数老板本的C系统不允许用结构体变量作函数参数,只允许用指向结构体变量的指针作函数参数,传递的是结构体变量的首地址。

而ANSIC取消了这一限制,规定按值传递方式。在函数调用时,系统为形参结构体变量分配存储空间,并从相应的实参结构体变量中取得各成员的值,若对形参中结构体变量各成员值进行修改,并不能修改实参结构体变量各成员的值。注意,实参和形参结构体变量类型应当完全一致。P125例6.221结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型22结构体数组结构体数组的定义与初始化1.结构体数组的定义结构体数组:数组的成员是结构体类型数据元素。

在定义结构体数组时,其定义方法与定义结构体变量方法类似,也有三种形式。第一种定义方式:

23structdate_type{intyear;intmouth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];};structstud_typestudent[3];

由此就定义了一个结构体数组,数组名是student1,它有3个元素,每个元素都是structstud_type类型

每个数组元素各占41个字节(10+4+1+(4+4+4)+4+10=41)共占41*3个字节。242.结构体数组的初始化结构体数组在定义的同时可以初始化。其一般格式是在定义之后紧跟一个用花括号括起来的一组初始数据,为了增强可读性,最好使每一个数组元素的初始数据也用花括弧括起来,以此来区分各个数组元素。对刚定义的结构体数组student初始化如下:structstud_typestudent[3]={{"wang",196103,'m',1978,10,12,98,"xian"},{“zhang”,196102,‘f’,1977,1,10,87,“Beijing”},{“li”,196204,’m’,1977,9,21,82,”xian”}};25

结构体数组元素的引用和简单变量数组元素的引用一样:

数组名[元素下标]

结构体数组元素的成员引用:数组名[元素下标].成员名说明:(1)

可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。

定义:structstud_typestudent[3],student1;赋值:student1=student[0]; student[0]=student[1]; studnet[1]=student1;26(2)

不能把结构体数组元素作为一个整体直接进行输入或输出。如printf(“%d”,student[0]);或 scanf("%d",&student[0]);只能以单个成员为对象进行输入输出,如:scanf("%s",student[0].name);scanf("%d",&student[0].num);printf("%s",student[0].name);27例统计候选人选票structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,“Wang”,0};voidmain(){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++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang00028结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型29共用体共用体是一种同一存储区域由不同类型变量共享的数据类型。它提供一种方法能在同一存储区中操作不同类型的数据,也就是说共用体采用的是覆盖存储技术,准许不同类型数据互相覆盖。30共用体类型定义共用体类型的定义与结构体类似。一般定义格式如下:union共用体名{共用体成员表;};其中union是关键字,称为共用体定义标识符,共用体名同样由程序员来命名。大括号中的共用体成员表包含若干成员,每一个成员都具有如下的形式:数据类型标识符成员名;例如:uniondata{inti;charch;floatf;};31共用体变量定义与引用1.共用体变量的定义

共用体变量的定义和结构体变量定义一样有三种形式。union共用体名{

共用体成员表;}变量列表;如:uniondata{inti;charch;floatf;}a,b,c;32共用体和结构体有着本质的区别:

共用体是几个不同的变量共占同一段内存,且都是从同一地址开始存储,任意时刻只存储一种数据。分配空间的大小为需要存储的数据中占用字节数最多的那个数据类型的大小。

结构体是不同成员使用不同的存储空间,占用的空间大小为各个成员需要占用的字节数的和。33例:structdatauniondata{{shortinti;shortinti;charch;charch;}x;}x;200020022003x.ix.chx.fx.chx.ix.f2000342.共用体变量的引用

共用体变量名.成员名;

如上例所示:x.i;x.ch;x.f说明:(1)共用体变量不能同时存放多个成员的值,而只能存放其中一个值,即只能存放当前(最新)的一个成员的值;(2)就共用体变量整体而言,和结构体变量一样是不能进行整体的输入、输出,但可以在两个同一类型的共用体变量之间赋值;

35例共用体变量的引用

voidmain(){unionint_char{shorti;charch[2];}x;x.i=24897;printf(“i=%d\ni=%o\n”,x.i,x.i);printf(“ch0=%o,ch1=%o\nch0=%c,ch1=%c\n”,x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}36结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型37枚举类型

在实际应用中,有些变量的取值范围是有限的,仅可能只有几个值,如一个星期7天,一年12个月,一副扑克有4种花色,每一花色有13张牌等。整型数来表示:直观性差!如在程序中使用1,对于非编程者来说,它是代表星期一呢?还是一月份?很难区分。若在程序中使用“Mon”,则不会有人认为是代表一月份。由此看出,为提高程序的可读性,引入非数值量,即一些有意义的符号是非常必要的。对于这种应用,C语言引入枚举类型,所谓“枚举”,就是将变量可取的值一一列举出来。38枚举类型也要先定义其类型,再定义其变量。枚举类型定义的一般形式是:enum枚举名{枚举值列表;};其中enum是关键字,称为枚举类型定义标识符,枚举名由程序员命名。枚举值列表形式如下:

标示符1,标示符2,……,标示符n这里的标识符也是由程序员自定义,都是一些描述性标识符,要求不能重名,这些标识符分别代表不同枚举元素,通常称为枚举常量。39例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};由此定义了一个枚举类型enumweekday,它有7个枚举元素(常量)。在定义了类型之后,就可以用该类型来定义变量:enumweekdayworkday;变量的定义也可以有三种形式。40说明:(1)

在C语言中,每一个枚举常量的值取决于在说明时排列的先后次序,第一个枚举常量的序号为0(规定序号从0编起),因此,此枚举常量值为0,以后顺序加1,故不允许对枚举常量进行赋值操作。若想改变枚举常量的值,在枚举变量定义时可由程序员指定:如:enumfruit{apple=7,pear,orange=3,lemon,peach}t;此时apple的值为7,pear的值为8,orange的值为3,lemon,peach的值分别为4,5。41(2)

一个枚举变量的值只能是这几个枚举常量之一,可以将枚举常量赋给一个枚举变量,但不能将一个整数赋给它。如:

workday=sun;正确

workday=7;错误

42enumweekday{0123456sun,mon,tue,wed,thu,fri,sat};enumweekday{sun=7,mon,tue,wed,thu,fri,sat};enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};78910111213712345643结构体与共用体结构体概述结构体变量结构体数组共用体枚举类型用typedef定义类型44用typedef定义类型功能:用自定义名字为已有数据类型命名类型定义简单形式:typedeftypename;例typedefintINTEGER;类型定义语句关

温馨提示

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

评论

0/150

提交评论