文档详情

C语言-结构和链表.ppt

发布:2017-07-16约3.02万字共114页下载文档
文本预览下载声明
2. 联合变量中成员的引用 格式:联合变量名.成员名 例如:前面定义了联合类型Data及联合变量x、y,下面就可以正确地引用了。 x.ival /* 引用联合变量x的成员ival */ y.chval /* 引用联合变量y的成员chval */ 注意:只引用联合变量是错误的。 例如:printf(%d, x); /* 错误的引用 */ 说明:这是因为联合变量中的存储的是某个成员的值,不存储联合的所有成员。 * 使用联合变量-注意1 (1) 一个联合可以存放多种不同类型的数据,但实际上只存储着其中的一种数据,而不是同时存放着多种数据。存于联合中的值是最近一次存入的值。存入新值后,原有的值就全部或部分被新值所覆盖。 例如: x.ival = 1; x.fval = 2.0; x.chval= ?; 完成以上三个赋值后,只有x.chval是有效的,而x.ival或x.fval中的值已经变成无意义的了。 * 使用联合变量-注意2 (2) 联合类型变量定义时可以初始化,但只能对该变量的第一个成员置初值。 例如:Data x = {1}; /* 将数值1赋给x的ival成员,注意花括号是必须的 */ 下面的写法是错误的。 Data x = { 1, 2.0, ?}; /* 不能同时给3个成员赋值 */ * 使用联合变量-注意3 (3) 联合变量的开始地址和它的成员变量的开始地址是相同。例如,x、x.ival、x.fval、x.chval都是同一地址值。 利用联合所有成员都从同一地址开始存储的规定,可实现长数据的自然分拆。 例如: union { char s[4]; long lint; } u; long n = -5L; u.lint = n; /* 给联合变量u赋一个long型值 */ 则u.s[0]、u.s[1]、u.s[2]、u.s[3]是对long类型值按照字节的分拆。 * 使用联合变量-注意4、5 (4) 函数的形参类型不能是联合类型,函数的结果类型也不能是联合类型。但指向联合的指针可以作为函数形参,函数也可以返回指向联合的指针。 (5) 联合可出现在结构类型中,联合也可包含有结构和数组。引用结构中的联合,或联合中的结构与引用嵌套结构成员的书写形式完全一样 。 * 7.6 位域 在某些应用中,需要标志某些对象的状态或特征。这可分别用一个机器字中的一位二进制位或连续若干二进制位代表不同属性的状态。例如,某台计算机配置的磁盘机中的控制状态寄存器的字长为16位(自右至左,第0位至第15位)。设某些位的意义如下: 第15位: 置 1 表示数据传送发生错误; 第7位 : 置 1 表示设备已准备好,可传送数据; 第6位 : 置 1 允许响应中断; 第2位 : 置 1 表示读; 第1位 : 置 1 表示写。 * 7.6 位域 实现上述要求可以给对应字中的某些二进位定义一系列表示特征的代码。如 #define ERROR 0100000 /* 对应第 15 位错误标志 */ #define READY 0200 /* 对应第 7 位准备好 */ #define IENABLE 0100 /* 对应第 6 位允许中断 */ #define READ 04 /* 对应第 2 位读 */ #define WRITE 02 /* 对应第 1 位写 */ * 7.6 位域 在编译程序处理符号表时,为了区分每个标识符的类别属性,如变量名,函数名,类型名,及全局的,静态的等。描述类别属性的最简单方法是把表示类别属性的字符或整数中的某些二进位作为标志位使用。例如: #define VARIABLE O1 /* 第 0 位表示变量名 */ #define FUNCTION 02 /* 第 1 位表示函数名 */ #define TYPE 04 /* 第 2 位表示类型名 */ #define EXTERNAL 010 /* 第 3 位表示外部的 */ #define STATICAL 020 /* 第 4 位表示静态的 */ 通常称这种表示法为字位标志法,所有的数字必定是2的若干次幂。对这些位可以进行移位、屏蔽、求补等运算,就能实现对属性值的测试,存储等。 * 7.6
显示全部
相似文档