C结构体共同体和枚举_第1页
C结构体共同体和枚举_第2页
C结构体共同体和枚举_第3页
C结构体共同体和枚举_第4页
C结构体共同体和枚举_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C结构体共同体和枚举2023/1/172结构体

第1页/共29页2023/1/173

数组中的每一个元素属于同一种数据类型,利用数组处理大量的同类型数据是很方便的。但是在实际应用中,常常需要把不同类型而关系又非常密切的数据组织在一起,形成一个整体,以便于统一管理。一种称为结构体的数据类型,可以用来描述这种类型的数据集。

结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。结构通常用来定义存储在文件中的记录。第2页/共29页2023/1/174一:结构的定义

结构是一种派生类数据类型,在使用结构变量之前须先对结构进行定义。定义结构的一般格式为:

struct

结构名

{类型

变量名;

类型

变量名;

...};

结构名是结构的标识符不是变量名,花括号内的变量称之为结构的成员,类型可以是我们以前所学到的任意类型,甚至可以是结构但不能是结构本身,每个成员的类型可以不一样。

注意:每一个结构定义必须以分号结束!第3页/共29页2023/1/175

由于定义结构类型只是定义了一种数据类型,因此,当编译器编译结构体的定义时,并不为结构体中的成员分配任何内存空间,从而在定义结构体的成员时,不能指定成员的存储类型为auto、register、extern,但可以指定结构体成员的存储类型为static,其特点和作用将在以后介绍。第4页/共29页2023/1/176二:结构变量的定义

声明结构变量与声明其它类型变量类似,格式为:struct结构名结构变量名;

如:structstudent

{intNo;

charname[8];

floatscore;

};

studentstu1,stu2,stu[30];也可在定义结构的同时定义结构变量,如:

structstudent

{intNo;

charname[8];

floatscore;

}stu1,stu2,stu[30];第5页/共29页2023/1/177

与基本数据类型类似,在定义结构体类型的变量时,也可对该变量进行初始化,其方法与对数组的初始化方法类似,即采用用花括号括起来的初始值表。注意,初始值表中的数据类型必须与结构体中对应元素的类型一致(兼容的除外),否则会产生编译错误。另外,初始值表中的数据的个数不能大于结构体中元素的个数。在定义结构体类型的变量时,也可以指定变量的存储类型。第6页/共29页2023/1/178三:结构变量的初始化

structstudent

{intNo;

charname[8];

floatscore;};

studentstu1={9601,”张三“,96.5};

studentstu[2]={{9601,”张三“,96.5},{9602,”李四“,80}};

或者

structstudent

{intNo;

charname[8];

floatscore;

}stu[2]={{9601,”张三“,96.5},{9602,”李四“,80}};第7页/共29页2023/1/179

对于结构体类型的变量,在编译过程中,编译系统将为这些变量分配相应的内存空间,所分配的空间大小原则上为结构体中所有成员所占空间的总和。结构体变量也存在作用域的问题,其作用域与一般变量的作用域相同。第8页/共29页2023/1/1710

结构体类型变量的使用

对结构体变量的使用一般是通过对其成员的引用实现的。使用结构体变量的成员的一般格式为:

<结构体变量名>.<成员名>

其中,“.“是结构体成员运算符第9页/共29页2023/1/1711structstudent

{intNo;

charname[8];

floatscore;

};四:结构成员的访问

studentstu1;

cin>>stu1.No;

cout<<stu1.name;

stu1.score=89.5;第10页/共29页2023/1/1712

结构体类型变量本身也可参与一些运算:1)同类型的结构体变量可以相互赋值。

2)结构体类型变量不能直接进行输入输出。

3)结构体类型变量可以作为函数的参数,函数的返回值也可以是结构体类型。当函数的形参与实参为结构体类型的变量时,其结合方式属于值传递方式。

【例7.2】第11页/共29页2023/1/1713结构体数组

定义结构体数组的方法与定义结构体类型变量的方法类同,只是在定义时增加维数的说明,也有三种方法。在说明结构体数组时,可对它进行初始化,其方法与数组类似,有两种方法:第一种方法是将数组的每一个元素的成员的值用花括号括起来,再将数组的全部元素值用一对花括号括起来;第二种方法是在花括号内依次列出各个元素的成员值。

【例7.3】第12页/共29页2023/1/1714结构体类型的静态成员

在定义结构体类型时,可以把某一个成员的存储类型声明为静态的,这样,在这种结构体类型的所有变量中,编译系统只为该静态成员分配一个存储空间,即这种结构体类型的所有变量的静态成员的值都相同,只要改变了其中一个变量的静态成员的值,其它变量的该成员的值也随之改变。

【例7.5】第13页/共29页2023/1/1715

编译系统一开始就为结构体的静态类型成员分配内存空间,并进行初始化。但在结构体中说明的静态成员属于引用性说明,在这里并不会为其分配内存空间,因此必须在文件作用域的某一个地方进行定义性说明,而且仅能说明一次。定义性说明的一般格式为:

<类型><结构体类型名>::<静态成员名>;

其中<类型>与该静态成员的类型一致,符号“::”称为作用域运算符,它表示成员与结构的一种隶属关系。静态成员可以脱离具体结构体变量而存取,即可以利用结构体名和作用域运算符表示该成员。在用初始值表对结构体变量初始化时,不再对静态成员置初值,即初始值表将跳过静态成员。

第14页/共29页2023/1/1716*

位域

如将一个字或一个字节以二进位为单位划分为若干个区域,则每一个区域称为一个位域。位域通常用于表示较小范围内的数。定义位域的一般格式为:

struct<结构体名>{

unsigned<位域名1>:<二进位数>;

unsigned<位域名1>:<二进位数>;

};

位域名可以省略。位域名后的<二进位数>,可为0或正整数,表示相应的位域所占用的二进位数。第15页/共29页2023/1/1717

位域类型变量的使用方法与结构体类型变量的使用方法完全相同。

(1)在一个结构体中定义的任一个位域都必须在同一个存储单元中(4个字节共32位)。如果本存储单元中剩余的二进位不够定义一个位域成员时,则该存储单元的剩余的二进位不用,而从下一个存储单元开始。

(2)可以定义一个无名的位域成员,表示跳过若干个二进位。

(3)可以定义位数为0的位域成员,表示其下一个位域成员从下一个存储单元开始,此时该位域的位域名必须为空。第16页/共29页2023/1/1718(4)一个位域成员的长度不能大于一个存储单元的长度(32位)。

(5)位域变量的使用方法与结构体变量的使用方法完全一样。

(6)同一个存储空间中位域的分配方向随机器而异。

(7)当要存入一个成员中的数超过它所能表示的范围时,超过的高位将被去掉。

(8)位域的优点是可以节省存储空间,但在存取位域变量时,花费的时间较多。第17页/共29页2023/1/1719

共同体

与结构一样,共同体也是一种派生类数据类型,但是其成员共享同一存储空间,即成员公用一个内存位置,可在不同的时间保存不同的数据类型和不同长度的变量。第18页/共29页2023/1/1720

定义共同体类型的一般格式为:

union<共同体名>{

<类型名><变量名1>;

<类型名><变量名2>;

};

共同体类型变量的说明方法与结构体类型变量的说明方法类似,也有三种方法。

一般情况下我们把结构和共同体定义在程序开头,然后在函数内定义结构变量和共同体变量。第19页/共29页2023/1/1721

由于共同体中的成员占用同一个内存空间,该存储空间的大小为占用存储空间最大的成员所占用的字节数。另外,在使用一个共同体类型变量的成员之前必须先指定该成员的值。共用体成员的引用

同结构一样,可使用成员运算符“

.”。但值得注意的是,在同一个时候只能引用一个成员,引用当前成员,其它成员的值会被覆盖。

只能对共同体变量的第一个成员初始化,不能对整体初始化。第20页/共29页2023/1/1722【例】以下程序的运行结果是什么?

unionu_type

{inti;

charch[6];//A

longs;

};

structst_type

{u_typeu;

floatscore[3];

};

voidmain()

{cout<<sizeof(structst_type)<<endl;

}

20

考虑将A行改为:

charch[8]

或charch[10]

或charch[12]第21页/共29页2023/1/1723枚举类型(enum)

第22页/共29页2023/1/1724

枚举是一种自定义类型,一个用标示符表示的整型常数的集合,枚举在日常生活中很常见。

例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。枚举的说明与结构和共同体相似,其形式为:

enum枚举名{

标识符[=整型常数],

标识符[=整型常数],

...

标识符[=整型常数],

}枚举变量;

如果枚举没有初始化,即省掉"=整型常数"时,则从第一个标识符开始,

顺次赋给标识符0,1,2,...。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。第23页/共29页2023/1/1725

例如下列枚举说明后,x1,x2,x3,x4的值分别为0,1,2,3。

enumstring{x1,x2,x3,x4}x;当定义改变成:

enumstring

{x1,

x2=0,

x3=50,

x4

}x;

则x1=0,x2=0,x3=50,x4=51第24页/共29页2023/1/1726注意:

枚举中每个成员(标识符)结束符是“,”,

不是“;”,最后一个成员可省略“,”。初始化时可以赋负数,以后的标识符仍依次加1。枚举元素可以作为整型常量使用,可以直接输出。

如:enumcolor{Red,Green,Blue};

cout<<Green<<endl;//此时结果为1可以用枚举类型说明枚举类型变量,而且也有与结构体类型类似的三种说明方法。在说明枚举类型变量时,也可对它进行初始化,此时可将某一个枚举元素作为它的初始值。第25页/共29页2023/1/1727

通常将某个枚举元素赋给枚举类型的变量,但也可将相应的整数赋给枚举类型的变量,不过此时一定要进行强制类型转换。不过,可以将枚举变量或枚举元素直接赋值给整型变量。如:enumcolor{Red=5

温馨提示

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

评论

0/150

提交评论