九联合union十数据的引用类型转换十一位域或位字段.ppt
《九联合union十数据的引用类型转换十一位域或位字段.ppt》由会员分享,可在线阅读,更多相关《九联合union十数据的引用类型转换十一位域或位字段.ppt(42页珍藏版)》请在三一文库上搜索。
1、1,九、联合union 十、数据的引用类型转换 十一、位域或位字段,第12章 结 构 与 联 合,2,九、联合union 1. 联合的特性和定义 由关键字struct声明的数据描述称为结构类型而union 或class声明的数据描述称为联合类型或类类型,分别简称为 结构和联合或类。 结构、联合、类是集合数据类型。 int、float等是系统预先取好的可以直接使用的类名, 关键字struct和union 或class后紧跟的标识符则是用户引入 的类名,需要事先加以声明。,3,在程序设计中常出现非此即彼的数据,这些数据的类型 可以不同,需要将其放置在同一片内存。 关键字union 建立的数据类型为
2、用户引入的联合类型, 简称联合。联合一方面是节省内存空间,另一方面是特殊的 编程考虑。 联合的特性和定义: 联合类型定义的变量称为联合变量。指向联合变量的指 针简称为联合指针。联合类型的声明和联合变量的定义采用 与结构类似的语法,不同的是联合使用关键字union。,4,将前面关于结构声明复制过来略加变动并用union替代 struct得到: union UnionName 联合 联合名 type member; 数据类型 成员名 ; type2 member2; 数据类型2 成员名2; typen membern; 数据类型n 成员名n; ; ; 关键字union用于声明同一片内存可以存放不同
3、类型的 数据,但在一个时刻只有某一类型的数据处于有效的状态。,5,联合类型声明中的数据成员具有如下的性质: a. 不同的成员占有起始地址相同的内存区域,这些成 员以并排的方式重合在一起。 b. 该内存区域的长度确定为所有成员中占有内存空间 最长的成员所对应的长度。 c. 在一个具体的时刻仅包含一种数据成员有效虽然成 员可以是集合型的数据。 d. 初始化联合变量时默认对第一个成员进行赋值亦仅 对一个成员赋值,初始值的类型属性应与第一个成员的类型 属性一致,否则编译器至少给出警告。 e. C+中联合不参入继承机制即联合类既不作基类也不 作派生类,不能有虚拟函数。,6,例 联合的内存和结构的内存大小
4、比较 #include typedef struct s_a double d; char c9; A; typedef struct s_b double d; long k2; B; typedef union u_t A a; B b; U; typedef struct s_t A a; B b; S; void main (void) printf (“sizeof(A)= %d,“, sizeof (A); printf (“sizeof(B)= %d,“,sizeof (B); printf (“sizeof(U)= %d,“, sizeof (U); printf (“size
5、of(S)= %d“, sizeof (S); /输出:sizeof (A)= 24,sizeof (B)= 16,16, sizeof (U)= 24,24,sizeof (S)= 40,7,联合一经声明就可以定义联合变量、联合数组和联合指 针。 箭头运算符“-”与圆点运算符“.”可以用来访问联合中 的成员,箭头运算符“-“的左侧是联合指针,圆点操作符“.“ 的左侧是联合变量,右侧是联合中的成员。 这和结构变量的使用规则一致。 不同的是结构变量拥有结构中各独立的成员所占内存之 和; 联合变量则仅是最大成员所拥有的内存,这一片内存可 由若干类型属性不同的成员适当索引,它们齐头地占有同一 块内存
6、。,8,联合遵循先声明后定义再使用的次序。如下所示: typedef union u_t int k4; long member; float y; U; U obj, *pobj; obj.member /联合变量名.成员名 pobj-member /联合指针名-成员名 三个步骤可以合为一体,再加上初始化格式为: union u_t int k4; long member; float y; b = 1,2,3,4; 初始化只对第一个联合成员进行。该凝练的格式声明一 个名为u_t的联合名,其拥有三个并置的成员,第一个是int 型的数组成员k4、第二个是long型的成员member,第三 个是
7、float型的成员y.这三个成员的内存起始地址是一样的。,9,例 联合指针入口形参和联合引用返回 #include inline int f(int k) return k; typedef union u_t char* s; int (*f)(int); int d; Un ; Unn+),10, Un y= initial ( /输出:abcd,abcd 1,2 3,3 联合变量、联合指针和联合引用可以作为形参,联合变 量可以相互赋值。 对联合变量的操作需要特别注意成员的类型属性,不同 类型属性的成员应由不同的分支处理。,11,2. 联合的内存映像 考虑如下初始化于一体的联合声明和联合变
8、量的定义: union u_t int k4; long z; float y; b=1,2,3,4,c; 声明了一个联合名为u_t的联合类型,具有三个成员, 这三个成员是int型数组k4,long型成员z,float型成员y。 第一个成员是数组成员k。同时定义了两个联合变量b 和c,在定义联合变量b的时候对其第一个成员进行了初始化 处理。 该联合占有的内存空间是: sizeof (b)=sizeof (union u)= sizeof (int4)= sizeof (b.k)=16,12,该联合在32位编程模式下的内存布局如下: int型数组k4 long型成员z 8 12 16 float
9、型成员y 4 联合的数据内存分布 在PC微机上数据的存放方式是低尾端形式的, 即short 型16位字节的低8位存放在内存的低地址处, 高8bit存放在内 存的高地址处高尾端的存放方式则相反。 下页的例子说明数据在PC内存中的顺序是低尾端形式。,13,例 强制类型转换显示低尾端的存储格式(8位二进制数的低 位在右边,高位在左边). #include void main() unsigned long m = 0x87654321UL; unsigned char * p=(unsigned char*) ,14,上例低尾端的PC计算上输出结果:21 43 65 87 这样32位整数的8个 4位
10、二进制数的十六进制数数码表示 为: m= h7h6h5h4h3h2h1h0 =87654321 该数以字节即8位bit为最小内存寻址单位的内存存储格 式为(低地址标注在左边): 16进制表示: 低地址 高地址 2进制表示: 低地址 高地址,15,联合的同一片内存可以通过不同的名称索引。对一个成 员的改变直接影响联合中的其它成员的数据状态,对数据的 解释取决于数据的存储格式和模块转换。 例 联合的内存布局和内存数据的解释 #include typedef union u_t char c2; unsigned long k; U; void main() U x = 3,1; /x.c0=3;x
11、.c1=1; 潜在地导致x.c2=0;x.c3=0; printf (“%d,0x%08xt“,x.k,x.k); x. k= 0x67686162UL; printf (“%c,%d,%c,%d; “,x.c0,x.c0,x.c1,x.c1); printf (“%c,%d,%c,%dn “,x.c2,x.c2,x.c3,x.c3); ,16,说明:占4字节的整型数 (4个8位的十六进制数)存贮格 式在微机上是低尾端格式,具有如下的形式(低地址标注在 边,8位二进制数的低位在右边): 高地址 低地址 k= 0x0000|0103 1*16*16+3=259 x.k= 0x67686162UL
12、; 高地址 低地址,17,例浮点数和整型数内存存储格式不同 #include typedef union u_fl float f; long k; Ua; typedef union u_il int f; long k; Ub; struct Sab union float f ; long k; a; Ub b; s= 1.0,2 ; void main() printf(“%1.0f,%dt“,s.a.f,s.b.f); Ua /输出:1,2 20,1092616192 0,40 10,10 20,20,18,联合将不同类型的数据锁定在一块起始地址相同的内存, 通过不同的成员名称或别名
13、来索引内存,以多种方式解释同 一内存数据。 联合具有特殊的数据强制类型转换的能力。 注意: union float f ; long k; a; 是联合类型直接定 义变量,此时联合是无名的。但这种格式不减少访问内层成 员的层次 。,19,3. 无名联合 无名联合在声明时不带联合名,这种声明在C+语言 中具有特殊的含义。 在无名联合中定义的名称超出定界的一对花括号之外, 不能跟同一作用范围其它的变量名冲突,不能有成员函数。 在全局范围定义的无名联合必须声明为静态的,结构中的无 名联合其成员访问控制属性是公共的,不允许存在私有的成 员。 a. 局部的和全局的无名联合 局部范围的无名联合实际上定义的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 联合 union 数据 引用 类型 转换 一位 字段
链接地址:https://www.31doc.com/p-2571183.html