C语言程序设计实用教程陈方第7章_第1页
C语言程序设计实用教程陈方第7章_第2页
C语言程序设计实用教程陈方第7章_第3页
C语言程序设计实用教程陈方第7章_第4页
C语言程序设计实用教程陈方第7章_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

7.1结构体结构体和共用体与数组一样都属于构造类型。数组的特点是一个数组变量中的所有元素必须是同一种数据类型。显然,用数组处理大量同类型数据是非常方便的。但是在实际生活中,有许多密切相关的数据需要统一考虑和处理,而它们的数据类型是不同的,如一个学生的档案信息,包括学号、姓名、性别、年龄、学习成绩……,这些数据的类型有整型、字符型、实型等。为了处理由这些不同类型的数据组合成的有机整体,我们引入了一个新的数据类型,称为结构体。7.1.1结构体类型与结构体类型的变量1.结构体类型的定义结构体类型定义的一般格式为:

struct结构体名{数据类型

成员名1;数据类型

成员名2;……

数据类型

成员名n;};其中,struct是定义结构体类型的关键字。“结构体名”是该结构体的名称,是设计者自己命名的,其命名规则与标识符的命名规则相同。由struct和“结构体名”二者组成结构体类型标识符,花括号内列出了该结构体中各成员变量类型及名称。一个结构体由多个成员变量构成,每个成员变量的类型可以是任何数据类型。注意:不要忽略最后的分号。

2.结构体类型变量的定义

结构体类型定义后,应当定义结构体类型的变量,简称结构体变量。结构体变量的定义方式有三种。

(1)先定义结构体类型,再定义结构体变量。定义的一般格式为:

struct结构体名

结构体变量名表列;

(2)在定义结构体类型的同时定义结构体变量。定义的一般格式为:struct结构体名{结构体成员表;}结构体变量名表;(3)直接定义结构体变量。定义的一般格式为:struct{结构体成员表列;}结构体变量名表列;这种定义形式省略了结构体名。

7.1.2结构体变量的引用与初始化1.结构体变量的引用

由于结构体变量中包含若干不同数据类型的成员项,为了引用变量中的某一个成员,必须指明该成员属于哪一个变量。对结构体变量的引用是通过对其成员的引用来实现的。引用结构体变量中成员的方式为:结构体变量名.成员名“·

”是成员运算符,它在所有的运算符中优先级最高。2.结构体变量的初始化

结构体变量的初始化与数组的初始化非常相似,即在定义结构体变量的同时为其成员赋初始值,把各成员的值按顺序放在等号右边的花括号中,各值之间用逗号隔开。[例7-1]

建立一个学生的信息表,对结构体变量初始化。main(){structstudent{longnum;charname[20];charsex;intage;floatscore;};structstudentstu1={102401,"DingYi",‘M’,18,94.5};printf("No.=%ld,Name=%s,sex=%c,age=%d,score=%.2f\n",stu1.num,,stu1.sex,stu1.age,stu1.score);}7.1.3数组数组的元素也可以是结构体类型的,这样就构成了结构体数组。结构体数组的每一个元素都是具有相同结构体类型的结构体变量。在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个单位的职工的工资表等。1.结构体数组的定义

结构体数组的定义方法与结构体变量的定义方法相似。例如:structstudent{longnum;charname[20];charsex;intage;floatscore;}stu[40];定义了一个结构体数组stu,它包含40个元素stu[0]~stu[39],每个数组元素都是structstudent类型的结构体形式。

2.结构体数组的初始化结构体数组的初始化与数组的初始化一样。3.结构体数组元素的引用

结构体数组的每个元素相当于一个结构体变量,因此引用结构体数组元素的成员与引用结构体类型变量的成员的方式相似。引用一个结构体数组元素的成员变量的格式为:

结构体数组名[下标].成员名[例7-2]

使用结构体数组计算学生的平均成绩。structstudent{intnum;charname[10];floatscore;}stu[5]={{101,"WangPing",80.5},{102,"HuangHao",90},{103,"XuePing",70.5},{104,"ZhaoMei",75},{105,"JiaMing",62.5}};main(){inti;floatave,sum=0;for(i=0;i<5;i++)sum+=stu[i].score;ave=sum/5;printf("average=%f\n",ave);}7.1.4结构体指针

1.结构体指针变量(1)结构体指针变量的定义struct结构体名*结构体指针变量名;例如:structstudentstu1,*ptr;这里定义了一个structstudent类型的指针变量ptr以及一个结构体变量stu1,其中structstudent为已经定义过的结构体类型。(2)结构体指针变量的初始化结构体指针变量的初始化就是把结构体变量的首地址赋给它,(3)结构体指针变量的使用利用结构体指针变量可以方便地引用结构体变量成员。其引用的一般形式为:

(*结构体指针变量名).成员名或:

结构体指针变量→成员名

2.结构体数组指针

一个结构体指针变量不仅可以指向结构体变量,也可以指向结构体数组,这种指向结构体数组的指针就是结构体数组指针。

(1)结构体数组指针的定义结构体数组指针的定义方法与结构体变量指针的定义方法类似,只要把结构体数组的首地址赋给该指针变量即可。

(2)结构体数组指针的使用

设ptr为指向结构体数组的指针变量,则ptr指向该结构体数组的第0号元素,ptr+1指向第1号元素,ptr+i则指向第i号元素。这与普通数组的情况是一致的。7.1.5结构体与函数在实际编程中,可以用结构体变量和结构体指针变量作为函数参数,以实现函数之间的数据传递。常用的有以下三种方法:(1)结构体变量的成员作函数参数

结构体变量的成员可作为函数参数,用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意,实参与形参的类型应保持一致。(2)结构体变量作函数参数

用结构体变量作函数参数,取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,严重地降低了程序的效率,因此这种方法较少使用。(3)用结构体指针变量作函数参数

用结构体指针变量作函数参数进行传送,这时由实参传向形参的只是地址,从而减少了时间和空间的开销,使程序效率提高。7.2共用体

共用体(或称联合),也属于构造类型。共用体类型的定义和共用体类型变量的定义方式与结构体定义方式相似。但它们的含义不同,结构体变量中的成员占据独立的内存空间,而共用体变量中的所有成员共用同一段内存空间,在同一时刻,共用体只有一个成员变量是可用的,结构体变量所占内存长度是各成员占的内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。1.共用体类型的定义

共用体类型定义的一般格式为:union共用体名{数据类型

共用体成员名1;数据类型

共用体成员名2;…

…数据类型

共用体成员名n;};

其中,union是关键字,是共用体类型的标志。共用体名的按标识符的命名规则命名。

2.共用体变量的定义

定义共用体变量与定义结构体变量相似,也有3种方式。(1)定义共用体类型的同时定义共用体变量。例如:uniondata{inti;charj;floatk;}m;其中,m为共用体类型变量,它的成员共用同一个内存单元中,且该内存单元的长度等于最长的成员的长度4字节(因为一个float型变量占4个字节)。(2)先定义共用体类型再定义共用体变量。(3)直接定义共用体变量。3.共用体变量的引用方式

只有先定义了共用体变量才能引用它。而且不能单独引用共用体变量,只能引用共用体变量中的成员。引用共用体变量的格式为:共用体变量名.成员名4.共用体类型数据的特点

在使用共用体类型数据时要注意以下一些特点:(1)同一个内存段可以用来存放不同类型的成员,但在每一瞬时只能存放其中的一种,也就是说每一瞬时只有一个成员起作用,其他的成员不起作用。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后原有的成员就失去作用。

(3)共用体变量的地址和它的各成员的地址都是同一地址。(4)不能单独引用共用体变量名,而必须带有成员名,即采用“共用体变量名.成员名”的形式。(5)不能在定义共用体变量时对它初始化。

(6)共用体变量不能作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。(7)共用体成员可以有结构体类型,反之,结构体成员也可以有共用体类型,数组也可以作为共用体的成员。(8)可以定义共用体数组。7.3枚举如果一个变量只有几种可能的值,可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。例如:表示月份的数据只能是1到12之间的整数,表示颜色的数据取值只能是红、黄、蓝等颜色。1.枚举类型的定义

枚举类型定义的一般格式为:enum枚举类型名{枚举值列表};例如:enummonth{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat};

其中,enum是关键字,说明这是枚举类型。枚举类型名按标识符的命名规则命名。

花括号内的内容是枚举类型的取值,必须列出所有可能的取值。花括号中的名字是用户指定的,相当于一个常量,可以在程序代码中直接使用。系统自动为每个枚举值分配一个编号,从0开始以1为单位递增。即上例中Sum的编号为0,Mon的编号为1,如此类推。C语言不允许直接使用数值作为枚举值,如下面的定义是不合法的:enumweek{0,1,2,3,4,5,6};但可以在类型定义时对枚举值显式分配编号,如有定义:enumcolor{red=2,yellow,green,black,blue=9};则枚举值red的编号为2,yellow的编号为3,green的编号为4,black为5,而blue的编号为9。没有显示写出编号的枚举值的编号以前一个的编号为准以1为单位递增。2.枚举类型变量的定义

枚举类型变量定义的一般格式有3种:①

enum枚举类型名{枚举值列表}枚举变量表;②

enum枚举类型名

枚举变量表;③

enum{枚举值列表}枚举变量表;上述第3种枚举类型变量的定义方式必须在它之前先定义好枚举类型。3.枚举类型变量的使用规则

(1)枚举变量的取值只能是指定的若干个枚举值之一。例如:enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat}wk;

wk=Fri;(2)不允许直接将一个整型数赋值给一个枚举变量,因为它们属于不同的类型。

(3)枚举值可以进行比较。比较的规则是按其在定义时的编号比较。如果定义时未指定,则按系统缺省的顺序编号比较,即第一个枚举值为0。

例如:enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat}wk1,wk2;wk1=Mon;wk2=Tue;if(wk1<wk2)printf("wk1isearlierthanwk2");7.4用typedef定义类型名

在第2章第3节中,已介绍了可以用typedef定义新的类型名,取代C语言提供的标准类型名(如int、char、float、double、long等),同样,用它定义新的类型名也可以代替结构体、共用体、指针、枚举类型名。其定义格式为:typedef已有类型名

新类型名;

例如:typedefintINTEGER;

温馨提示

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

评论

0/150

提交评论