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

下载本文档

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

文档简介

结构体与共用体第一页,共六十八页,编辑于2023年,星期五

教学要求:

1.掌握结构体类型和结构体变量的定义方法。

2.掌握结构体变量的使用,掌握结构体数组的应用。

3.初步掌握单链表的基本操作。

4.掌握共用体变量的定义方法及其引用。

第12章结构体与共用体第二页,共六十八页,编辑于2023年,星期五

一辆银灰色的车牌号为湘A00001的雪弗兰轿车以80km/h的速度行驶。在这里由车牌、车名、型号、车速共同构成了对一辆轿车的描述,在数据处理中,这四个属性应该当作一个整体来处理。但它们不属于同一类型,无法用数组来容纳,而用单个变量来分别代表各个属性,又难以反映出它们的内在联系。

C语言提供结构体(structure)数据结构,将不同数据类型、但相互关联的一组数据,组合成一个有机整体使用。

12.1概述第三页,共六十八页,编辑于2023年,星期五

1.

结构类型定义定义形式:strcut结构类型名

{数据类型

成员1;数据类型

成员2;

……

……;数据类型

成员n;

};

/*些行的分号不能少*/也可以表述成如下形式:

struct结构体名

{

分量表

};

12.2结构类型与结构变量的定义(1)struct是结构类型关键字(2)“结构体名”和“数据项名”的命名规则,与变量名相同。(3)1个数据项称为结构类型的1个成员(或分量)。第四页,共六十八页,编辑于2023年,星期五

2.

结构体类型特点

(1)定义一个结构体类型,系统不会为其分配内存单元。定义一个类型只是表示这个类型的结构,即告诉系统它由哪些类型的成员构成,各占多少个字节,各按什么形式存储,并把它们当作一个整体来处理。

(2)结构体类型由多个成员组成,成员的数据类型可以是整型、实型、字符型、数组,也允许是另一个已经定义的结构体类型。

(3)结构体类型是根据设计者的需要来组合的。

(4)结构体类型系统没有预先定义,凡需要使用结构体类型数据的,都必须在程序中自己定义。

第五页,共六十八页,编辑于2023年,星期五

structstudent {

intnum; charname[20]; charsex; intage; floatscore; charaddr[30]; };例如:定义学生档案信息结构类型:成员表列

struct是类型关键字后分号不能少,表明语句结束。结构体名第六页,共六十八页,编辑于2023年,星期五又例如,定义一个日期结构类型:

structdate{intyear;intmonth;intday;};

数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。写为如下形式:

structdate{intyear,month,day;};3.

结构体成员的类型可以是结构体类型

在定义一个结构体类型时,可以利用已定义的另一个结构体类型来定义其成员的类型。第七页,共六十八页,编辑于2023年,星期五例12.1嵌套结构体类型定义的例子。

structdatestructstudent{intmonth;{intnum; intday;charname[20]intyear;charsex,};intage;structdatebirthday;charaddr[30];};numnamesexage

birthdaymonthdayyearaddr

结构类型student的“birthday”数据项可以是一个已经定义的结构类型date第八页,共六十八页,编辑于2023年,星期五

4.

声明结构体类型变量

(1)先定义结构体类型再定义变量名。定义了结构体类型structstudent

后,

structstudent {charno[7];charname[9];charsex[3];structdatebirthday; };

可以用它定义变量。如:

structstudentst1,st2;

不能写成structst1,st2;

第九页,共六十八页,编辑于2023年,星期五为了方便起见,可以在程序开头定义符号常量进行简化。如:

#defineSTUDENTstructstudent

则在程序中可以直接写成:

STUDENT {charno[7];charname[9];charsex[3];structdatebirthday; };

STUDENTst1,st2;第十页,共六十八页,编辑于2023年,星期五

(2)

在定义类型的同时定义变量。则一般定义形式为:

struct结构体名

{

分量表;

}变量表;如:structstudent

{charno[7];charname[9];charsex[3];structdatebirthday; }st1,st2;第十一页,共六十八页,编辑于2023年,星期五

(3)直接定义结构类型变量定义形式为:

struct

{

分量表;

}变量表;在

struct后不出现结构体名,因此也不能再以此定义相同的结构体变量。如:struct {charno[7];charname[9];charsex[3];structdatebirthday; }st1,st2;第十二页,共六十八页,编辑于2023年,星期五1.结构变量的引用

对于结构变量,要通过成员运算符“.”,逐个访问其成员,访问的格式为:

结构变量名.成员 例如,structstudentst1,st2;st1.no,引用结构变量st1中的no成员;

引用结构变量st1中的name成员,

引用结构变量st2中的name成员,也可以引用结构体变量以及变量成员的地址例如,&st1&st1.no其中的“.”是成员运算符

12.3结构体变量的初始化和引用第十三页,共六十八页,编辑于2023年,星期五如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。此时的引用格式扩展为:

结构变量名.成员.子成员.….最低1级子成员例如,引用结构变量st1中的birthday成员的格式分别为:st1.birthday.yearst1.birthday.monthst1.birthday.day(1)对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。第十四页,共六十八页,编辑于2023年,星期五

(2)

只能对结构体变量的各分量进行输入输出,不能将一个结构体变量直接进行输入输出。

scanf(“%s,%s,%s,%d,%d,%d”,&st1); 错误

printf(“%s,%s,%s,%d,%d,%d”,st1);错误

scanf(“%s”,);正确

scanf(“%d”,&st1.birthday.day);正确

printf(“%s,%d”,,st1.birthday.day);

正确

(3)

分量和结构体变量的地址均可以被引用。如:

scanf(“%s”,st1.name);

(输入st1.name的值)

printf(“%x”,&st1);

(以十六进制输出st1的首地址)第十五页,共六十八页,编辑于2023年,星期五2.

结构变量的初始化结构变量初始化的格式,与一维数组相似:

结构变量={

初值表}不同的是:如果某成员本身又是结构类型,则该成员的初值为一个初值表。例如:st1={“000102”,

“张三”,“男”,

{1980,9,20}}注意:初值的数据类型,应与结构变量中相应成员所要求的一致,否则会出错。第十六页,共六十八页,编辑于2023年,星期五

例12.2外部存储类的结构体变量初始化structstudent1{longintnum;charname[20];charsex;charaddr[30];}a={89031,“LiLin”,‘M’,“123BeijingRoad”};main(){printf(“%ld,%s,%c,%s\n”, a.num,,a.sex,a.addr);}输出结果:89031,LiLin,M,123BeijingRoad第十七页,共六十八页,编辑于2023年,星期五

3.

关于结构体类型的几点说明

(1)类型与变量是两个不同的概念。先定义结构体类型,再定义该类型变量。在编译时,对变量分配空间,对类型来说不存在分配空间。变量可以赋值、存取或运算,而类型没有这些操作。

(2)

结构体中的分量名可以与程序中的其它变量同名,它们代表不同的对象,互不干扰。对结构体中的分量可以单独使用。第十八页,共六十八页,编辑于2023年,星期五(3)不可以将两个结构变量进行关系比较非法语句structtemp

{inta;charch;

}x1,x2;main()

{x1.a=10;x2.ch='a';if(x1==x2)

}第十九页,共六十八页,编辑于2023年,星期五

(4)可以把一个结构体变量赋给另一个同类型的结构体变量。structtemp

{inta;charch;

}x1,x2;main()

{x1.a=10;x1.ch='a';x2=x1

printf("%d,%c",x2.a,x2.ch);}把结构变量x1的值

赋给结构变量x2.第二十页,共六十八页,编辑于2023年,星期五

(5)

结构体类型的变量在内存中占有一段连续的存储单元。占有连续存储单元的大小取决于成员的数据类型.如:structexp{inta;floatb;charch[8];};

structexpx={1234,56.7,"text"}结构体类型变量x在内存共占用14个字节的连续单元第二十一页,共六十八页,编辑于2023年,星期五(6)可通过sizeof()运算符获得结构体变量占用的内存大小。

structexp{inta;floatb;charch[8];}x;

main(){intsize;size=sizeof(x);

printf("size=%d\n",size);}第二十二页,共六十八页,编辑于2023年,星期五例12.3

结构体成员的使用#include<stdio.h>#include<conio.h>structscore{intmath;inteng;intcomp;};structstu{charname[12];charsex;longStuClass;structscoresub;};第二十三页,共六十八页,编辑于2023年,星期五main(){structstus1={"LiMing",'M',990324,88,80,90};structstus2;clrscr();s2=s1;

[0]='H';[1]='u';s2.StuClass=990325;s2.sub.math=83;printf("Record1-%s,%c,%ld,%d,%d,%d\n“,

,s1.sex,s1.StuClass,s1.sub.math,s1.sub.eng,p);printf("Record2-%s,%c,%ld,%d,%d,%d\n",,s2.sex,s2.StuClass,s2.sub.math,s2.sub.eng,p);}相同结构类型变量可直接赋值第二十四页,共六十八页,编辑于2023年,星期五12.4 结构体数组结构体数组每个数组元素都是一个结构体类型的数据,且这些数据又分别包括各个分量。结构体数组的定义、初始化等操作和内存中的存放方式与普通数组相类似。1.结构体数组的定义与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。结构体类型名数组名[n]例如:structstudentstu[3]structBookLibBook[4];第二十五页,共六十八页,编辑于2023年,星期五

2.结构数组初始化

与普通数组一样结构数组也可在定义时进行初始化。初始化的格式为:

结构数组[n]=

{{初值表1},{初值表2},...,{初值表n}}

例12.4

用结构类型structstudent

定义一个结构体数组stu[3],用于存储和显示三个学生的基本情况。

#include"struct.h"

structstudentstu[3]={{“000102”,“张三”,“男”,{1980,9,20}},{“000105”,“李四”,“男”,{1980,8,15}},{“000112”,“王五”,“女”,{1980,3,10}}};第二十六页,共六十八页,编辑于2023年,星期五

main(){inti;/*"□"表示1个空格字符*/printf("No.□□□Name□□□□Sex□Birthday\n");for(i=0;i<3;i++){printf("%-7s",stu[i].no);printf("%-9s",stu[i].name);printf("%-4s",stu[i].sex);printf("%d-",stu[i].birthday.year);printf("%d-”,stu[i].birthday.month);printf("%d-\n”,stu[i].birthday.day);}}

程序运行结果:No.NameSexBirthday000102

张三男1980-9-20000105

李四男1980-8-15000112

王五女1980-3-10第二十七页,共六十八页,编辑于2023年,星期五12.5结构体指针1.结构变量的指针:结构体变量在内存中的起始地址。2.指向结构体变量的指针变量定义格式:结构体类型名*变量名

例如:

structstudent*p,st1;P=&st1;则此时该指针变量P的值:是结构体变量的起始地址。也可以指向结构体数组中的元素,也可以用指向结构体的指针变量作函数参数。第二十八页,共六十八页,编辑于2023年,星期五

p为结构体指针变量,它可用来存放student型变量的地址numname…addrpstu1

p=&stu1;则p为stu1的首地址.3.

结构变量成员访问通过指向结构变量的指针来访问结构变量的成员。

structstudentp;第二十九页,共六十八页,编辑于2023年,星期五指针变量

p

指向结构变量st1,则3种形式等价:(1)st1.

成员分量运算符左侧的运算对象,只能是结构变量(2)p->成员运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量。“->”称为指向运算符。(3)(*p).成员(*p)表示p指向的结构体变量,不得省去括号。这样就有:st1.num

等价于

(*p).num

等价于p->num,第三十页,共六十八页,编辑于2023年,星期五请注意:

p–>n

得到p指向的结构体变量中的分量n的值。

p–>n++

等价于(p–>n)++得到p指向的结构体变量中的分量n的值,用完该值后加1。

++p–>n

等价于++(p–>n)得到p指向的结构体变量中的分量n的值,并在用该值前,先加1。第三十一页,共六十八页,编辑于2023年,星期五例12.5指向结构体变量的指针变量应用。#include“stdio.h”structstudent{charnumber[9]; charname[8]; chardepartment[20];};main(){ structstudentstudent1,*p; printf(“\n学号:”);gets(student1.number); printf(\n姓名:”);gets(); printf(“\n系名:”);gets(student1.department);

p=&student1;

printf(“\n

学号:%s

姓名:%s

所在系:%s”,(*p).number,(*p).name,(*p).department);}第三十二页,共六十八页,编辑于2023年,星期五4.用结构体变量的指针作函数参数在函数调用时,可以用结构体变量名做形参和实参,也可以用结构体变量的指针作函数参数。例12.6函数的返回值是结构体变量。#include“stdio.h”structstudent{charnumber[9]; charname[8]; chardepartment[20];};structstudentinput();第三十三页,共六十八页,编辑于2023年,星期五main(){structstudentst1;st1=input();printf(“\n学号:%s姓名:%s所在系:%s”,st1.number,,st1.department);

}structstudentinput(){structstudenttemp;printf(“\n学号:”);gets(temp.number);printf(“\n姓名:”);gets();printf(“\n所在系:”);gets(temp.department);returntemp;}第三十四页,共六十八页,编辑于2023年,星期五例12.7

用结构体变量名做形参和实参。#include<stdio.h>char*s;structtree{inta;}x;voidfun(structtreet){t.a=t.a+10;t.s="computer";printf("%d,%s\n",x.a,x.s);}x.s="minicomputer";main(){x.a=6;func(x);

}程序运行结果:

16,computer

用结构体变量名做实参、形参第三十五页,共六十八页,编辑于2023年,星期五12.6结构体指针与链表链表是一种常见的动态地进行存储分配的数据结构。链表有“单向链表”、“双向链表”、“循环链表”、“双向循环链表”之分。

1.链表结构链表作为一种常用的、能够实现动态存储分配的数据结构。(1)头指针变量head:指向链表的首结点。(2)每个结点由2个域组成:

①数据域:存储结点本身的信息。

②指针域:指向后继结点的指针。(3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。第三十六页,共六十八页,编辑于2023年,星期五

2.单向链表

单向链表是按照输入数据的顺序建立的。它有一个“头指针”(图中为head),指向第一个元素;每一个元素称为“结点”,每个结点包括两个域:数据域和指下一个结点的指针域;最后一个元素的指针域为“NULL”(“空地址”),表示链表的结束,称为“表尾”。下图是一个“单向链表”的示例。第三十七页,共六十八页,编辑于2023年,星期五3.对链表的基本操作对链表的基本操作有:创建、检索(查找)、插入、删除和修改等。(1)创建链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)检索操作是指,按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则称为检索成功;否则,称为检索失败。(3)插入操作是指在链表中增加一个新结点,使线性表的长度增1,并且保持原有逻辑关系。(4)删除操作是指在链表中删除一个结点,线性表的长度减1,且保持原有逻辑关系。第三十八页,共六十八页,编辑于2023年,星期五

4.简单链表的建立例12.8简单链表的建立,将已经赋值的结构变量student1和student2链起来,构成一个具有2个结点的单链表。程序如下:#include“stdio.h”structstudent{charnumber[9]; charname[8]; chardepartment[20]; structstudent*next;};第三十九页,共六十八页,编辑于2023年,星期五main(){structstudent

student1={“M43000148”,”egg”,”计科系”},student2={“M43000101”,”csc”,”计科系”},*head,*p;

head=&student1; student1.next=&student2;

/*指向下一个学生信息存放的首地址*/

student2.next=NULL;p=head; while(p.next) {printf(“学号:%s

姓名:

%s

所在系:%s\n”,p->number,p->name,p->department);

p=p->next;}}第四十页,共六十八页,编辑于2023年,星期五

6.

用于动态存储分配的函数(1)malloc函数函数调用方式:void*malloc(unsignedsize)

函数说明:malloc()函数的原型在stdlib.h和alloc.h中。函数功能:从系统中请求分配大小为size的内存单元,如果成功则返回指向该区域的首字节的指针;如果分配失败则返回一个空指针NULL,即地址为0。

malloc()函数的返回值是一个无类型指针,其特点是可以指向任何类型的数据。例如以下2条语句:

intpa;pa=(int*)malloc(sizeof(int)*5);

执行上述语句后,指针变量pa

,指向内存中1个由10字节存储单元的首字节。第四十一页,共六十八页,编辑于2023年,星期五(2)free函数函数调用方式:voidfree(void*p);函数说明:free()函数原型在stdlib.h,

alloc.h中。函数功能:释放p所指的内存块,并将它返回给堆,以便这些内存成为再分配时的可用内存。p

是调用malloc()

函数的返回值。该函数无返回值。

原则上,在使用malloc()函数申请的内存存储块,操作结束后,应及时使用free()函数予以释放。尤其是循环使用malloc()函数时,如果不及时释放不再使用的内存块,很可能很快就耗尽系统的内存资源,从而导致程序无法继续运行第四十二页,共六十八页,编辑于2023年,星期五(3)calloc函数函数调用方式:void*calloc(unsignednum,unsignedsize);函数说明:calloc函数原型在stdlib.h和alloc.h中。函数功能:从系统中请求分配大小为num*size大小的内存单元,如果如果成功则返回指向该区域的首字节的指针;如果分配失败则返回一个空指针,即地址为0。(4)realloc函数函数调用方式:voidrealloc(void*p,unsignednewsize)函数说明:realloc()函数原型在stdlib.h和alloc.h中函数功能:把p所指向的已分配的内存大小变成由newsize所确定的新的大小。第四十三页,共六十八页,编辑于2023年,星期五例12.9动态存储分配的函数使用实例。#include<stdlib.h>#include<stdio.h>#include<alloc.h>#include<string.h>voidmain(){ char*str1,*str2;if((str1=(char*)malloc(10))!=NULL) gets(str1);if((str2=(char*)calloc(10,sizeof(char)))!=NULL){strcpy(str2,str1);printf(“str1:%s\nstr2:%s\n”,str1,str2);}free(str1);recalloc(str2,0);return;}第四十四页,共六十八页,编辑于2023年,星期五7.

动态申请结点,建立单链表

动态申请结点,建立单链表有两个关键问题:第一,结点的存储空间必须是由程序来请求分配;第二,结点之间必须形成链状。8.建立单链表算法(1)建立头结点:指针p

指向向系统申请的第一个结点,输入结点数据域的数据;头指针head和指针rear指向头结点;头指针head

,指向链表的头结点,作函数返回值。第四十五页,共六十八页,编辑于2023年,星期五(2)在头结点后增加第2个结点,第3个结点…

p指向申请的第2个新结点,用rear->next=p;实现连接第2个新结点;rear

=p;rear指向第2新结点;p指向申请的第3个新结点,用rear->next=p;实现连接第3个新结点;rear

=p;rear指向第3新结点;…(3)rear指向链表的尾结点时,

rear->next=NULL

。第四十六页,共六十八页,编辑于2023年,星期五例12.10用动态存储分配函数,动态申请结点,建立单链表程序。#include“stdio.h”structstudent{ charnumber[9],name[8],department[20]; structstudent*next;};main(){structstudent

*head=NULL,*p,*last;charIs_exit; while(1){p=(structstudent*)malloc(sizeof(structstudent));

if(p==NULL) continue;

/*如果申请失败,继续申请直到成功为止*/第四十七页,共六十八页,编辑于2023年,星期五

printf(“\n学号:”);gets(p->number);printf(“\n姓名:”);gets(p->name);printf(“\n所在系:”);gets(p->department);p->next=NULL;if(head==NULL){head=p;last=p;continu;}

else{last->next=p;last=p;}printf(“\n是否继续录入数据:(Y/N)”);scanf(“%c”,Is_exit);if(Is_exit==y||Is_exit==Y)continu;

elsebreak;} last->next=NULL;}第四十八页,共六十八页,编辑于2023年,星期五

9.删除一个新结点基本思路:通过单链表的头指针,顺着结点的指针域找到要删除结点,将该结点从单链表中断开。

在有序的单链表中删除一个新结点,存在的4种情况。

(1)为空表,无结点删除

(2)删除第一个结点,头指针指向第二个结点

(3)删除链表中的结点

(4)删除最后一个结点(表尾结点)第四十九页,共六十八页,编辑于2023年,星期五

10.插入一个新结点

单链表中插入一个新结点,可能存在的4种情况。

(1)为空表,插入一个新结点,构成只有一个结点的链表

(2)在第一个结点前插入,插入新结点为头结点

(3)顺着结点的指针域找到第i个结点,将新结点插入到第i个结点之后,链表长度增加1

(4)在最后一个结点后插入,新结点为尾结点

第五十页,共六十八页,编辑于2023年,星期五12.7共用体

1.共用型概念

使几个不同的变量占用同一段内存空间的结构称为共用型。

2.共用类型的定义──与结构类型的定义类似

union

共用类型名

{

成员列表};

3.共用变量的定义──与结构变量的定义类似直接定义形式如下:间接定义形式如下:

union共用体名union共用体名

{分量表{分量表};}变量表;union共用体名变量表;第五十一页,共六十八页,编辑于2023年,星期五4.共用变量的引用与结构变量一样只能逐个引用共用变量的成员

printf(“%d”,a);

错误

scanf(“%d”,&a);

错误访问变量a

各成员的格式为:a.i、a.ch、a.f

scanf(“%d”,&a.i);printf(“%d\n”,a.i);5.共用体与结构体相似之处(1)都是由不同类型的数据项组成一个(2)都只能对分量进行操作和引用。第五十二页,共六十八页,编辑于2023年,星期五例12.12对共用体变量的使用struct{intnum;编号

charname[10];姓名

charsex;性别

charjob;类别:s学生

t教师

union{intciass;班号

charposition[10];

职务

}category;}per[2];构造类型(数组、结构体、共用体)的定义可以嵌套第五十三页,共六十八页,编辑于2023年,星期五

main(){intn,i;for(i=0;i<2;i++){scanf(“%d%s%c%c”,&per[i].num,per[i].name,&per[i].sex,&per[i].job);if(per[i].job==‘s’)scanf(“%d”,&per[i].category.class);elseif(per[i].job==‘t’)scanf(“%s”,per[i].category.position);elseprintf(“inputerror!”);}prints(“\n”);}第五十四页,共六十八页,编辑于2023年,星期五6.共用变量特点(1)系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,存放的和起作用的是最后一次存入的成员值。(2)由于所有成员共享同一内存空间,故共用变量与其各成员的地址相同。(3)不能对共用变量进行初始化(注意:结构变量可以);也不能将共用变量作为函数参数,以及使函数返回一个共用数据,但可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。第五十五页,共六十八页,编辑于2023年,星期五

struct

memb{floatv;intn;charc;}sa1;

sa1占7个字

节内存空间unionmemb{floatv;intn;charc;}usa2;

usa2占4个字节内存空间

100110051007vnc2001vnc200220032004

共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。第五十六页,共六十八页,编辑于2023年,星期五

7、共用体与结构体的主要区别(1)结构体变量

占用空间是各成员所占空间之总和;

共用体变量

占存储空间是各成员中所占空间最大者。(2)结构体变量各成员占用内存中一片连续的存储区,各成员的地址互不相同;共用体变量各成员在内存中所占空间的起始地址相同。(3)结构体变量的各个分量在任何时刻都同时存在,且可同时引用。共用体变量的各个分量在同一时刻只存在其中一个,也只能引用其中的一个。

(4)结构体变量可以初始化,共用体变量不能初始化。第五十七页,共六十八页,编辑于2023年,星期五例12.13共用体的内存使用。#include<stdio.h>voidmain(){union{inti;charstring[2];}a;

a.i=24897;printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);string[0]=’0’;string[1]=’0’;printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);}程序运行结果:i=24897,string1=A,string2=ai=8224,string1=0,string2=0第五十八页,共六十八页,编辑于2023年,星期五例12.14

将共用体变量作为函数的参数。#include<stdio.h>uniontest{ inti; charstring[2];}a;voidshow(uniontesta){printf(“i=%d,string1=%c”,a.i,a.string[0]);printf(“string2=%c\n”,a.string[1]);return;}voidmain(){a.i=24897;show(a);string[0]=’0’;string[1]=’0’;show(a);return;}程序运行结果:I=24897,string1=A,string2=aI=8224,string1=0,string2=0第五十九页,共六十八页,编辑于2023年,星期五1.定义格式:enum

枚举类型名

{取值表};例如,enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

{

}中的标识符称为枚举常量。它只能为标识符,不能为数字常量或字符常量2.枚举变量的定义(与结构体变量类似)(1)间接定义例如,enumweekdaysw1,w2;(2)直接定义例如,enumweekdays{Sun,Mon,Tue,Wed,Thu,Fri,Sat}w1,w2;

12.8枚举类型第六十页,共六十八页,编辑于2023年,星期五3.枚举型使用说明(1)枚举型仅适应于取值有限的数据。

温馨提示

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

评论

0/150

提交评论