资源预览内容
第1页 / 共48页
第2页 / 共48页
第3页 / 共48页
第4页 / 共48页
第5页 / 共48页
第6页 / 共48页
第7页 / 共48页
第8页 / 共48页
第9页 / 共48页
第10页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Huazhong Univ. of Sci. and Tech.Wuhan Polytechnic University单片机原理与应用*第3部分 C语言篇(扩展) 4l 学习内容和目标 结构体; 联合体; 枚举类型等 继续上次讨论的测控系统l 注意: 思维一定要开阔一些,多问为什么。 允许不用举手,并随时打断,向我提任何和课程相关的问 题。*2本节学习目标l 考虑以下问题: 结构体和联合体同基本数据类型有什么不同? 结构体变量和联合体变量有什么本质区别? 枚举类型的变量在应用上与其他数据类型的变量有何不同 ? 我们能用他们做什么?*31 结构体和联合体引言2.1 定义 l 在标准C语言中,使用结构可以把不同类型的数据存储在一起。作为 一种复杂数据类型,在C语言程序中首先要进行结构定义,然后才能 进行结构变量的定义和使用。 l 结构是由不同数据类型的数据组成的。组成结构的每个数据称为该结 构的成员项,简称成员。在程序中使用结构时,首先要对结构的组成 进行描述,这称为结构的定义。*42 结构的定义和使用结构定义的一般形式:struct 结构名数据类型 成员名1;数据类型 成员名2;.数据类型 成员名n;l 为了处理雇员的数据,在程序中可以定义如下的结构: struct Employee char name20;char sex;int old;int wage; ;*52.2 定义举例结构名:Employee第一个成员项:字符型数组name 用于保存姓名字符串第二个成员项:字符型数据sex 用于保存性别字符第三个成员项:int型整数old 用于保存年龄数据最后一个成员项:int型整数wage 用于保存工资数据l关键字struct作为标识符。结构名由用户命名,命名原则与变量名等 相同。 l每个成员项由其它数据类型和成员名组成。每个成员项后和整个结 构的定义均用分号“;”作为结束符。l结构的定义明确地描述了该结构的组织形式。在程序执行时,结构 的定义并不引起系统为该结构分配内存空间。*62.3 结构定义规则l注意:结构体和结构体变量是不同的内容。 l程序一旦定义了一个结构体,就相当于定义了一个新的结构类型, 那么就可以把结构名当作像int、double等关键字一样使用,用说明语 句定义该形式结构体的具体结构变量,其格式为:存储类型 struct 结构名 结构变量名;l结构变量的定义在程序的数据说明部分给出。例如,下列说明:struct Employee ssWHPU_PhDWang;*72.4 结构变量的定义我常用的定义方法: struct _tagEmployee 数据类型 成员名称 _attribute_ (packed);typedef struct _tagEmployee SSEMPLOYEE, *PSSEMPLOYEE;ltypedef : 使用typedef语句给已定义的结构类型赋予新的类型名,大大简化了 对结构变量的说明 typedef ; typedef则是在编译时进行处理的,它并不是进行简单的字符串替换 。定义了一个STRING类型,它是具有81个字符的数组,以后就可用 STRING类型定义类型的字符型数组。*82.4 结构变量的定义(续1)typedef char81 STRING;l_attribute_ : GNU C的一大特色 _attribute_可以设置函数属性、变量属性和类型属性。 _attribute_ (attribute-list) _attribute_设计的非常巧妙,很容易作到和其它编译器保持兼容, 也就是说,如果工作在其它的非GNU编译器上,可以很容易的忽略 该属性。即使_attribute_使用了多个参数,也可以很容易的使用一 对圆括弧进行处理,例如: 具体内容请参见GUN C的说明*92.4 结构变量的定义(续2)/* 如果使用的是非GNU C, 那么就忽略_attribute_ */ #ifndef _GNUC_ #define _attribute_(x) /*NOTHING*/ #endiflpacked:对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何 类型的变量的访问可以从任何地址开始,但实际情况是在访问特定 变量的时候经常在特定的内存地址访问,这就需要各类型数据按照 一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就 是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不 同。一些平台对某些特定类型的数据只能从某些特定地址开始存取 。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其 平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如 有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位) 如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如 果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读 出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率 上下降很多。这也是空间和时间的博弈。 具体内容请参见C/C+语言的packed说明*102.4 结构变量的定义(续3)l结构变量的定义将引起系统按照结构定义时制定的内存模式,为被定 义的结构变量分配一定的内存空间。例如,上述结构变量在内存中将 占据与原图所示配置相同的内存空间。当多个结构变量使用结构时, 它们可以在一起定义。struct Employee wang, li,zhang;l结构变量使用内存空间,所以它们也具有一定的存储类型。结构变量 的存储类型概念、它的寿命、可见性及使用范围与普通变量、数组完 全一致。 l在程序中,结构变量的定义在该结构的定义之后,对于尚未定义的结 构,不能用它对任何结构进行说明。*112.5 结构变量定义的说明l在一些简单的程序设计中,结构的定义和结构变量的定义也可以同时 进行,在这种情况下,有时省略结构名。这时,被定义的结构变量直 接在结构定义的大括号后给出。l一个结构变量占用内存的实际大小,可以利用sizeof运算求出。sizeof 运算的功能是计算出给定的运算量占用内存空间的字节数,它的运算 表达式一般形式如下: sizeof(运算量)*122.5 结构变量定义的说明(续1)struct Employee char name20;char sex;int old;int wage; wang ,song ,zhou;struct Employee char name20;char sex;int old;int wage; ; struct Employee wang ,song ,zhou;l最后,推荐做法: 注意编程规范:注释、变量名定义 先定义一个结构体 然后使用typedef重定义结构体名:结构体、结构体指针 这些定义放在头文件中; 在合适的地方直接引用结构体定义结构体变量*132.5 结构变量定义的说明(续2)struct _tagEmployee 数据类型 成员名称 ;typedef struct _tagEmployee SSEMPLOYEE, *PSSEMPLOYEE; SSEMPLOYEE ssPhD_Wang, ssPhD_Liu; PSSEMPLOYEE pssPhD_Zhang;lC提供了两种类型的聚合数据类型:数组和结构。 数组是相同类型的元素的集合,它的每个元素是通过下标引用或指针 间接访问选择的。 但在结构中情况并非如此,由于结构的成员可能长度不同,所以不能 使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是 通过名字来访问的。此外,在结构说明的同时可以给各个成员项赋初 值,即结构的初始化。 l结构是不同数据类型的若干数据的集合体。在程序中使用结构时,一 般情况下不能把结构作为一整体参加数据处理,而参加各种运算和操 作的是结构的各个成员项数据。结构的成员项用以下一般形式表示: 结构变量名.成员名 ssPhD_Wang.iAge 务必注意“.”符号来访问结构体的成员l考虑: 结构体变量中含有指针怎么办? 都知道有符号“-”也可以访问成员变量,这和“.”有什么区别?*142.6 结构变量的使用形式和初始化l定义的Employee1结构中的成员项name是一个char型指针。如果结构 变量zhou被说明为Employee1结构,则zhou的成员项zhou.name是一个 char型指针。l下面的使用形式: *zhou.name 表示是该指针指向的目标变量。即: *zhou.name=*(zhou.name)*152.7 结构成员项是指针变量时struct Employee1 char *name;char sex;int old;int wage; zhou;上述表达式中有两种运算: *(访问目标)和(访问成 员)。运算优先于*运算。 所以,访问成员运算在先, 而访问目标运算在后。l在结构说明的同时,可以给这个结构的每个成员赋初值,这称为结构 的初始化。结构初始化的一般形式如下:l其中大括号中包围的初始数据之间用逗号分隔,初始数据的个数与结 构成员项的个数应该相同,它们是按先后顺序一一对应赋值。此外, 每个初始数据必须符合与其对应的成员项的数据类型。 l例如,前述Employee结构的结构变量wang在说明时可以初始化如下 :*162.8结构体的初始化struct 结构名 结构变量=初始数据;struct Employee wang=“wang hai“,M,34,“123-1111“,“beijing“;wang.name=“wang hai“; wang.sex=M; wang.old=34; wang.tel=“010-12345678“; wang.adr=“beijing“;l *172.9 结构体使用例子#include /结构的定义 struct Employee char *name;char sex;int old;char *tel;char *adr; ; void main() /结构变量的定义struct Employee wang,gao; /结构变量的成员赋值wang.name=“wang hai”;wang.sex=M;wang.old=34;wang.tel=“010-12345678“;wang.adr=“beijing“;gao.name=“gao yang“; gao.sex=F;gao.old=42;gao.tel=“021-87654321“;gao.adr=“shanghai“;/显示结构变量的成员内容printf(“ name sex old tel addressn“ );printf(“ n“);printf(“%-14s%-4c%-4d%-10s%-20sn”,wang.name,wang.sex,wang.old, wang.tel,wang.adr);printf(“%-14s%-4c%-4d%-10s%-20sn“,gao.name,gao.sex,gao.old, gao.tel,gao.adr); name sex old tel adr wang hai m 34 010-12345678 beijing gao yang f 42 021-8765432
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号