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

下载本文档

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

文档简介

1第11章结构体与共用体南京信息工程大学计算机系C

语言程序设计2023/1/172第11章结构体与共用体11.1概述11.2定义结构体类型变量的方法11.3结构体变量的引用11.4结构体变量的初始化11.5结构体数组11.6指向结构体类型数据的指针11.7用指针处理链表11.8共用体11.9枚举类型11.10用typedef定义类型2023/1/173一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?11.1概述?信息管理结构体——一种构造类型数据

结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。2023/1/174

struct结构体名{数据类型1成员名1;数据类型2成员名2;……数据类型n成员名n;

};11.1概述结构体类型定义的一般形式:

struct为关键字;结构体名是用户定义的类型标识。{}中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。2023/1/175例如图书类型的定义:

structbookcard{charnum[10];/*图书分类编号是字符数组类型*/charname[30];/*书名是字符数组类型*/

charauthor[30];/*作者是字符数组类型*/charpublisher[60];/*出版社是字符数组类型*/

floatprice;/*价格是单精度实型*/

intn;/*库存量是整型*/

};例如学生类型的定义:structstudent{charnum[8];/*学号是字符数组类型*/charname[30];/*姓名是字符数组类型*/charsex;/*性别是字符型

*/intage;/*年龄是整型

*/

charaddr[60];/*住址是字符数组类型*/intscore[6];/*成绩是整型数组类型*/

};2023/1/176先声明结构体类型再定义变量名struct结构体名

变量名表;例如:structbookcardbook1;structstudents,t1,t2;按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。structstudentnum8个字节name30个字节sex1个字节age2个字节addr60个字节score12个字节11.2定义结构体类型变量的方法2023/1/177结构体类型与变量的说明类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。成员也可以是结构变量。对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员名可与程序中的变量名相同,也可与不同结构体类型的成员名相同,二者代表不同的对象。

structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;

structdatebirthday;/*成员为结构体类型*/

charaddr[60];intscore[6];

};num8个字节name30个字节sex1个字节birthdayyear2个字节month2个字节day2个字节addr60个字节score12个字节2023/1/178在声明类型的同时定义变量例如:structstudent{charnum[8],name[20],sex;intage;floatscore;

}st;struct结构体名{

成员定义表;

}变量名表;11.2定义结构体类型变量的方法2023/1/179直接定义结构体类型变量

例如:struct{charnum[8],name[20],sex;intage;floatscore;

}st,a,b,c;struct{

成员定义表;

}变量名表;11.2定义结构体类型变量的方法2023/1/1710结构体变量成员引用的一般形式:结构体变量名.成员名

结构体变量a的各成员可分别表示为a.num、、a.sex、a.birthday、a.score

structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;“.”是分量运算符,运算级别最高。a.birthday.year

a.birthday.month

a.birthday.day

结构体变量的各个成员可进行何种运算,由该成员的数据类型决定

11.3结构体变量的引用2023/1/171111.3结构体变量的引用用sizeof运算符计算结构体变量所占内存空间

structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;

sizeof(a)

的结果为8+20+1+6+4=39

sizeof(structstudent)

的结果为39

2023/1/1712同类型结构体变量之间的赋值运算结构体变量之间进行赋值时,系统将按成员一一对应赋值。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b,c;c=a;11.3结构体变量的引用2023/1/1713可以引用结构体成员的地址,也可以引用结构体变量的地址

structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;对结构体变量a进行

&a运算,可以得到a的首地址,它是结构体类型指针。

11.3结构体变量的引用2023/1/171411.4结构体变量的初始化

【例11.4】结构体变量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b={"9608025","Zhangliming",'F',{1978,5,10},87},c;

如果初值个数少于结构体成员个数,

则将无初值对应的成员赋以0值。

如果初值个数多于结构体成员个数,

则编译出错。2023/1/1715结构体数组的定义三种形式:形式一:

structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:

structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:

struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B11.5结构体数组2023/1/1716例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};结构体数组引用引用方式:结构体数组名[下标].成员名

structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);11.5结构体数组2023/1/1717【例11.5】结构体数组的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{"9606011","Liming",'M',87.5},

{"9606012","Zhangjiangguo",'M',79},{"9606013","Wangping",'F',90}};

元素的个数可以省略,根据赋初值时

结构体常量的个数确定数组元素的个数

11.5结构体数组

2023/1/1718structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){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);}namecountLiZhangWang000例统计候选人选票2023/1/171911.6指向结构体类型数据的指针结构体指针变量定义的一般形式:

struct结构体名

*指针变量名;structdate{intyear,month,day;}*q;例如:structstudent*p;p是指向structstudent结构体变量的指针变量

1.指向结构体变量的指针

2023/1/17202.结构体成员的三种引用形式

用结构体变量名的引用形式:

d.year

d.month

d.daystructdate{intyear,month,day;}d,*p=&d;

用结构体指针变量的引用形式:(*p).year(*p).month(*p).dayp->yearp->monthp->day“->”是指向结构体成员运算符,优先级为一级

11.6指向结构体类型数据的指针2023/1/1721

【例9_a】输入今天的日期,然后输出该日期。

main() {structdate

/*在函数中定义结构体类型*/

{

intyear,month,day;

}today,*p=&today;

/*定义结构体变量及其指针*/

printf("Entertodaydate(YYYY/MM/DD):"); scanf("%d/%d/%d",&today.year,&today.month,

&today.day);printf("Today:%d/%d/%d\n",p->year,p->month,p->day); }11.6指向结构体类型数据的指针2023/1/1722【例11.8】分析自增自减运算对程序结果的影响。structcode{inti;charc;}a[]={{100,'A'},{200,'B'},{300,'C'},{400,'D'}};a数组100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'11.6指向结构体类型数据的指针2023/1/1723main(){structcode*p=a;printf("%d\t",++p->i);printf("%c\t",(++p)->c);printf("%d\t",(p++)->i);printf("%c\t",++p->c);printf("%d\t",p->i++);printf("%d\n",p->i);}a数组100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'p101'D'301101B200D30030111.6指向结构体类型数据的指针2023/1/17244.用结构体变量和指向结构体的指针作函数参数方法一:在函数之间直接传递结构体数据。函数的形参定义为结构体变量。函数调用时,可将主调函数的结构体类型实参传递给被调函数的形参。如果将函数定义为结构体类型函数,可利用return语句将一个结构体数据结果返回到主调函数中。11.6指向结构体类型数据的指针2023/1/1725方法二:在函数之间传递结构体指针。

形参定义为指向结构体类型的指针变量,可将主调函数的结构体指针传递给被调函数的形参变量,通过指针形参的指向域的扩展,操作主调函数中结构体变量及其成员。如果将函数定义为结构体指针型函数,可利用return语句将被调函数中结构体变量的指针返回给主调函数的结构体指针变量。方法三:利用全局结构体变量传递结构体数据。4.用结构体变量和指向结构体的指针作函数参数11.6指向结构体类型数据的指针2023/1/1726structdata{inta,b,c;};voidmain(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");

func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数2023/1/1727structdata{inta,b,c;};voidmain(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");

func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)例用结构体指针变量作函数参数arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****2023/1/1728结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。在需要节省内存储空间时,c语言还提供了一种由若干个不同类型的数据项组成,但共享同一存储空间的构造类型。11.8共用体11.8.1共用体的概念共用体——一种构造类型数据

共用体由若干不同类型的数据项组成,构成共用体的各个数据项称为共用体成员。由于共享的特性,只有最新存储的数据是有效的。2023/1/1729

union共用体名{数据类型1成员名1;数据类型2成员名2;……数据类型n成员名n;

};共用体类型定义的一般形式:

union为关键字;共用体名是用户定义的类型标识。{}中是组成该共用体的成员。成员的数据类型可以是C语言所允许的任何数据类型。11.8共用体11.8.1共用体的概念2023/1/1730例如:

unionutype{

inti;charch;longl;charc[4];

};

定义了一个unionutype共用体

类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成情况。

11.8共用体11.8.1共用体的概念2023/1/1731u1变量chu1变量iu1变量l1.共用体变量的定义

利用已定义的共用体类型名定义变量union共用体名

变量名表;例如:unionutypeu1,u2;按照共用体类型的组成,系统为定义的共用体变量分配内存单元。共用体变量所占内存大小等于共用体中占用内存的长度最长的成员。u1变量cc[0]c[1]c[2]c[3]11.8共用体11.8.1共用体的概念2023/1/17321.共用体变量的定义

在定义共用体类型的同时定义变量例如:

unionutype{

inti;charch;longl;charc[4];

}a,b,c;union共用体名{

成员定义表;

}变量名表;11.8共用体11.8.1共用体的概念2023/1/17331.共用体变量的定义

直接定义共用体类型变量

例如:

union{

inti;charch;longl;charc[4];

}a,b,c;union{

成员定义表;

}变量名表;11.8共用体11.8.1共用体的概念2023/1/1734用sizeof运算符计算共用体变量所占内存空间

unionutype{

inti;charch;longl;charc[4];

}a,b,c;

sizeof(a)

的结果为4

sizeof(unionutype)

的结果为4

11.8共用体11.8.2共用体变量的引用方式

2023/1/1735同类型共用体变量之间的赋值运算共用体变量之间进行赋值时,系统仅赋当前有效

成员的值(即最新存储的数据)。

unionutype{

inti;charch;longl;charc[4];

}a,*p=&a;对共用体变量进行取址运算11.8共用体11.8.2共用体变量的引用方式

2023/1/1736共用体变量成员的引用有三种形式。例如:

unionu{charu1;intu2;}x,*p=&x;

用共用体变量名的引用形式:

x.u1

x.u2

用共用体指针变量的引用形式:(*p).u1(*p).u2p->u1p->u211.8共用体11.8.2共用体变量的引用方式

2023/1/1737【例11.18】共用体变量赋初值。unionu{charu1;intu2;};main(){unionua={0x9741};printf("1.%c%x\n",a.u1,a.u2);a.u1='a';printf("2.%c%x\n",a.u1,a.u2);}

共用体类型变量在定义时只能对第一

个成员进行赋初值。

由于第一个成员是字符型,用一个字

节,所以对于初值0x9741仅能接受0x41,

初值的高字节被截去。

1.A412.a61对u2成员的引用是无意义的11.8共用体11.8.2共用体变量的引用方式

2023/1/1738main(){union{longn;intk;charc;}un;un.n=0x12345678;printf("%lx\n",un.n);printf("%x\n",un.k);printf("%x\n",un.c);un.c='A';printf("%ld\n",un.n);printf("%d\n",un.k);printf("%c\n",un.c);}1234567856787830541984122081A0x780x560x340x12低地址高地址0x120x340x560x4100010010001101000101011001000001高地址低地址11.8共用体11.8.2共用体

温馨提示

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

评论

0/150

提交评论