《C语言程序设计与数据结构》第9章 结构体与共用体

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言程序设计与数据结构第九章结构体与共用体C语言程序设计与数据结构总体要求:掌握结构体的概念;掌握结构体成员的引用;学会使用typedef声明数据类型的别名。C语言程序设计与数据结构学习重点:结构体的概念;结构体成员的引用。C语言程序设计与数据结构结构体概念的引入(为什么需要结构体?)C语言程序设计与数据结构已经学习过的数据类型:整形、实型、字符型,另外还有数组。问题:以上数据类型和数组是否完全满足编程需要?(例如:如何定义一个工人变量?)C语言程序设计与数据结构工人包含有多个属性,比如姓名、性别、年龄、工号、工资等等,我们无法简单的用某一种数据类型或者数组来实现。C语言程序设计与数据结构解决方法:C语言中引入了一种新的数据结构,称为“结构体”。它可以把若干个有内在联系的数据组合在一起,形成一个有机整体。C语言程序设计与数据结构通过结构体,我们就可以方便的来描述工人,它由若干数据项组成,包括:姓名(name):字符串性别(sex):字符型年龄(age):整型工号(number):整型工资(salary):实型C语言程序设计与数据结构上述五个数据项组成了工人的整体,这就是一个结构体类型的数据,我们可以给这个数据命名为worker,只要是worker类型的数据,都包括这五个数据项。C语言程序设计与数据结构9.1结构体类型的说明C语言程序设计与数据结构结构体类型是包含若干个相同或不同数据类型数据项的集合,我们把这些数据项称之为结构体成员,声明结构体类型的一般形式为:struct结构体标识名{数据类型名1结构体成员名表1;数据类型名2结构体成员名表2;.....数据类型名n结构体成员名表n;};C语言程序设计与数据结构说明:(1)句首struct是关键字,是声明结构体类型的标识符。“结构体标识名”定义的是结构体的名字,它是可选项,可以不出现;“结构体成员名表”由多个成员名组成,彼此之间用分号隔开,两者都要符合标识符的命名规则。(2)结构体中定义的所有成员都用大括号括起来,成员名可以与程序中其他变量相同。(3)结构体中的“数据类型名”可以是基本类型,也可以是构造类型(如数组),还可以是已经定义的其他结构体类型。(4)结构体类型的定义只是创建了一种模式,表示该结构体的组成情况。结构体定义结束后,系统并没有为该结构体分配相应的空间;只有在我们使用这种结构体进行定义变量后,系统才为结构体变量分配存储空间。C语言程序设计与数据结构上述工人(worker)结构体类型可以声明为:structworker{charname[20];charsex;intage,number;floatsalary;};C语言程序设计与数据结构9.2结构体变量C语言程序设计与数据结构9.1.2结构体变量定义、初始化及引用1.结构体变量的定义结构体变量的定义通常有以下几种方法:C语言程序设计与数据结构(1)首先说明某种结构体类型,然后紧跟在结构体类型说明之后定义变量。定义的一般形式如下:struct[结构体名]{数据类型名1结构体成员名表1;数据类型名2结构体成员名表2;┇┇数据类型名n结构体成员名表n;}变量名表;C语言程序设计与数据结构例如,我们想定义上述“worker”结构体类型的变量,可以这样写:structworker{charname[20];charsex;intage,number;floatsalary;}worker1;C语言程序设计与数据结构从上面我们可以得知,在声明worker结构体类型的同时,我们定义了结构体变量worker1。每一个结构体变量在定义之后都会分配一块连续的内存空间。变量worker1存放的是一组数据,具体来说就是一个工人的信息,各个成员按照在结构体声明中的顺序依次在内存中进行排放。C语言程序设计与数据结构(2)在说明某一个结构体类型的同时,不给该结构体类型命名,而直接进行变量定义。C语言程序设计与数据结构例如,我们想定义上述“worker”结构体类型的变量,可以把worker省略,写成:struct{charname[20];charsex;intage,number;floatsalary;}worker1;C语言程序设计与数据结构这一种定义方式和上一种类似,只是省略了结构体标识名。如果只定义一次这种结构体类型的变量,可以使用这种方式。C语言程序设计与数据结构(3)先声明某种结构体类型,再定义这种结构体类型的变量。C语言程序设计与数据结构例如,先对worker结构体进行声明,structworker{charname[20];charsex;intage,number;floatsalary;};然后定义worker结构体类型的变量:structworkerworker1;C语言程序设计与数据结构使用这种方式定义变量应该注意:struct和worker必须一起出现。不能只写worker不写struct,因为worker不是某种类型标识符,它不可以单独定义变量;也不能只写struct不写worker,因为struct本身不能唯一的标识一种数据类型,struct是构造结构体类型的关键字,结构体类型可以有很多种模式,因此struct必须与某一种结构体标识名结合使用,以此来说明具体是哪一种结构体类型。这里struct与worker结合使用,能够唯一说明这是worker结构体类型。C语言程序设计与数据结构2.结构体变量的初始化和一般的变量一样,结构体变量也可以进行初始化。C语言程序设计与数据结构对变量worker1进行初始化:worker1={“张三”,‘M’,28,100,2500.00f};它描述了这样的信息,该工人姓名为张三,性别男,年龄28岁,工号为100,工资数为2500。C语言程序设计与数据结构C编译程序按照每个成员在结构体中声明的顺序一一对应赋值,不可以跳过前面的成员直接给后面的成员赋值,但是可以只给前面若干成员赋值,后面没有赋值的成员由系统赋予默认值。C语言程序设计与数据结构3.结构体变量的引用(1)一般结构体变量的引用一般结构体变量的引用是通过成员运算符“.”来实现的,形式如下:结构体变量名.成员名C语言程序设计与数据结构例如:worker1种的成员可以这样引用:worker1.name,worker1.sex,worker1.age,worker1.number,worker1.salary;成员运算符在所有运算符中优先级最高,所以,上述引用结构体变量worker1成员的写法可以看作一个整体。C语言程序设计与数据结构与同一类型的普通变量一样,结构体变量中的各个成员也可以进行相应的各种运算,如:worker1.sex=‘F’;worker1.age++;worker1.salary=3000f;C语言程序设计与数据结构(2)相同类型结构体变量间的引用ANSIC新标准允许相同结构体类型的变量之间可以互相整体赋值。C语言程序设计与数据结构例如,定义了两个结构体worker类型的变量worker1和worker2。可以把worker1作为一个整体赋值给worker2,方法如下:worker2=worker1;C语言程序设计与数据结构9.1.3用结构体变量作函数参数新的C标准中,允许结构体变量作为一个整体传送给形参。这时实际传递的是结构体变量各成员的值,系统会为形参开辟临时存储单元,然后将实参成员的值一一传递给形参成员。C语言程序设计与数据结构9.2结构体数组C语言程序设计与数据结构结构体数组与普通数据类型数组形式和使用方式类似,只不过前者中的每个元素都是一个结构体类型的数据。C语言程序设计与数据结构结构体数组的定义方式与结构体变量的定义方式基本相同,只需把定义变量的位置改为数组即可。C语言程序设计与数据结构9.2.2结构体数组的初始化结构体数组初始化的方式与普通数组相同,只不过其中的元素换成了结构体类型的变量,我们通常用一对花括号将每一个元素各成员的值包含起来。C语言程序设计与数据结构structworker{charname[20];charsex;intage,number;floatsalary;}workarray[5]={{“张三”,‘M’,28,100,2500.00f},{“李娜”,‘F’,20,101,1200.00f},{“王霞”,‘F’,25,102,2200.00f},{“朱刚”,‘M’,35,103,3200.00f},{“胡强”,‘M’,19,104,1000.00f}};C语言程序设计与数据结构或者:workarray[]={{“张三”,‘M’,28,100,2500.00f},{“李娜”,‘F’,20,101,1200.00f},{“王霞”,‘F’,25,102,2200.00f},{“朱刚”,‘M’,35,103,3200.00f},{“胡强”,‘M’,19,104,1000.00f}};C语言程序设计与数据结构9.3结构体指针我们也可以声明结构体类型的指针,结构体指针存储的是一个结构体类型变量或者结构体数组在内存中占有的一段连续存储单元的首地址。或者可以说,结构体指针是指向结构体变量或者结构体数组中的指针。C语言程序设计与数据结构9.3.1指向结构体变量的指针下面我们声明一个指向worker结构体类型变量的指针。structworker{charname[20];charsex;intage,number;floatsalary;}*pworker;C语言程序设计与数据结构通过指针访问结构体变量成员的方式有两种:指针变量名-成员名(*指针变量名).成员名例如,通过指针变量pworker访问其中的成员age,可以写成:pworker-age(*pworker).ageC语言程序设计与数据结构9.3.2用指向结构体变量的指针作函数参数结构体指针变量也可以用来作为参数在函数中传递,方式与普通指针变量作为函数参数传递时一样。只是我们在传递实际参数的时候,要保证它是一个指向结构体变量或数组的指针或者是结构体变量或数组的首地址。C语言程序设计与数据结构9.4共用体C语言程序设计与数据结构共用体的类型声明方式、变量的定义方式与结构体的类型说明方式、变量的定义方式相似。两者的不同之处在于:结构体变量中的每个成员都占据自己的内存空间,而共用体变量中的所有成员共同占据一块存储空间,即共享这块空间。C语言程序设计与数据结构9.4.1共用体类型的说明共用体类型说明的一般形式为:union共用体标识名{数据类型名1共用体成员名表1;数据类型名2共用体成员名表2;┇数据类型名n共用体成员名表n;};C语言程序设计与数据结构union是声明共用体类型的关键字。在形式上,共用体与结构体基本一致,只是定义结构体类型的关键字struct被换成了定义共用体的关键字union。C语言程序设计与数据结构例如:unionu{inta,b,c;floatf1,f2;};C语言程序设计与数据结构9.4.2共用体变量的定义、初始化及引用1、共用体变量的定义、初始化与前面介绍的结构体变量的定义一样,共用体类型变量的定义也有四种方式。C语言程序设计与数据结构例:unionu{inta,b,c;floatf1,f2;}u1,u2[5],*p;C语言程序设计与数据结构结构体和共用体在定义变量的形式上相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。例如,上面定义的“共用体”变量u1总共占4个字节(因为该变量体类型中长度最长的成员类型为float,一个float型变量占4个字节),而不是占2*3+4*2=14个字节。C语言程序设计与数据结构由于共用体变量中所有的成员共享存储空间,所以所有成员的首地址相同,也就是该变量的地址。也就是说,&u1.a、&u1.b、&u1.c、&u1.f1、&u1.f2和&u1是相互等价的。C语言程序设计与数据结构2、共用体变量的初始化共用体变量各成员共享一段存储空间,因此,共用体变量在

1 / 74
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功