共用体
点击次数:19 次 发布日期:2008-12-01 11:58:42 作者:源代码网
|
源代码网推荐元。其定义形式为: 源代码网推荐union 共用体名 源代码网推荐{成员表列}; 源代码网推荐7.5.1 共用体的定义 源代码网推荐union data 源代码网推荐{ 源代码网推荐int a ; 源代码网推荐float b ; 源代码网推荐d o u b l e c ; 源代码网推荐c h a r d ; 源代码网推荐} obj; 源代码网推荐该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 源代码网推荐数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一 源代码网推荐个小例子。 源代码网推荐[例7 - 8 ] 源代码网推荐union data /*共用体* / 源代码网推荐{ 源代码网推荐int a; 源代码网推荐float b; 源代码网推荐double c; 源代码网推荐char d; 源代码网推荐} m m ; 源代码网推荐struct stud /*结构体* / 源代码网推荐{ 源代码网推荐int a; 源代码网推荐float b; 源代码网推荐double c; 源代码网推荐char d; 源代码网推荐} ; 源代码网推荐m a i n ( ) 源代码网推荐{ 源代码网推荐struct stud student 源代码网推荐printf("%d,%d",sizeof(struct stud),sizeof(union data)); 源代码网推荐} 源代码网推荐 源代码网推荐程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 源代码网推荐 源代码网推荐对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 源代码网推荐空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程 源代码网推荐序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 源代码网推荐7.5.2 共用体变量的引用 源代码网推荐可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: 源代码网推荐union data /*共用体* / 源代码网推荐{ 源代码网推荐int a; 源代码网推荐float b; 源代码网推荐double c; 源代码网推荐char d; 源代码网推荐} m m ; 源代码网推荐其成员引用为:m m . a , m m . b , m m . c , m m . d 源代码网推荐但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 源代码网推荐[例7-9] 对共用体变量的使用。 源代码网推荐m a i n ( ) 源代码网推荐{ 源代码网推荐union data 源代码网推荐{ 源代码网推荐int a; 源代码网推荐float b; 源代码网推荐double c; 源代码网推荐char d; 源代码网推荐} m m ; 源代码网推荐m m . a = 6 ; 源代码网推荐printf("%d\n",mm.a); 源代码网推荐m m . c = 6 7 . 2 ; 源代码网推荐p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; 源代码网推荐m m . d = " w " ; 源代码网推荐m m . b = 3 4 . 2 ; 源代码网推荐p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; 源代码网推荐} 源代码网推荐 ![]() 源代码网推荐程序最后一行的输出是我们无法预料的。其原因是连续做m m . d = " w ";m m . b = 3 4 . 2;两个 源代码网推荐连续的赋值语句最终使共用体变量的成员m m . b所占四字节被写入34 .2,而写入的字符被覆盖 源代码网推荐了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决 源代码网推荐定。 源代码网推荐例子虽然很简单,但却说明了共用体变量的正确用法。 源代码网推荐[例7-10] 通过共用体成员显示其在内存的存储情况。 源代码网推荐定义一个名为t i m e的结构体,再定义共用体d i g: 源代码网推荐struct time 源代码网推荐{ 源代码网推荐int year; / *年* / 源代码网推荐int month;/ *月* / 源代码网推荐int day; / *日* / 源代码网推荐} ; 源代码网推荐union dig 源代码网推荐{ 源代码网推荐struct time data; /*嵌套的结构体类型* / 源代码网推荐char byte[6]; 源代码网推荐} ; 源代码网推荐假定共用体的成员在内存的存储是从地址1 0 0 0单元开始存放,整个共用体类型需占存储空间6个字节,即共用体d i g的成员d a t a与b y t e共用这6个字节的存储空间,存储空间分配示意如图7 - 7所示。 源代码网推荐 ![]() 源代码网推荐由于共用体成员d a t a包含三个整型的结构体成员,各占2个字节。由图7 - 7所示可见, 源代码网推荐d a t a . y e a r是由2个字节组成,用b y t e字符数组表示为b y t e [ 0 ]和byte[1] 。b y t e [ 1 ]是高字节, 源代码网推荐b y t e [ 0 ]是低字节。下面用程序实现共用体在内存中的存储。 源代码网推荐struct time 源代码网推荐{ 源代码网推荐int year; /*年* / 源代码网推荐int month; / *月* / 源代码网推荐int day; / *日* / 源代码网推荐} ; 源代码网推荐union dig 源代码网推荐{ 源代码网推荐struct time data; /*嵌套的结构体类型* / 源代码网推荐char byte[6]; 源代码网推荐} ; 源代码网推荐m a i n ( ) 源代码网推荐{ 源代码网推荐union dig unit; 源代码网推荐int i; 源代码网推荐printf("enter year:\n"); 源代码网推荐s c a n f ( " % d " , & u n i t . d a t a . y e a r ) ; / *输入年* / 源代码网推荐printf("enter month:\n"); 源代码网推荐s c a n f ( " % d " , & u n i t . d a t a . m o n t h ) ; / * 输入月* / 源代码网推荐printf("enter day:\n"); 源代码网推荐s c a n f ( " % d " , & u n i t . d a t a . d a y ) ; / *输入日* / 源代码网推荐p r i n t f ( " y e a r = % d month=%d day=%d\n", unit.data.year,unit. data. month, unit. 源代码网推荐d a t a . d a y ) ; / *打印输出* / 源代码网推荐f o r ( i = 0 ; i < 6 ; i + + ) 源代码网推荐p r i n t f ( " % d , " , u n i t . b y t e [ i ] ) ; / *按字节以十进制输出* / 源代码网推荐p r i n t f ( " \ n " ) ; 源代码网推荐} 源代码网推荐 源代码网推荐从程序的输出结果来看, 1 9 7 6占两个字节,由第0、1字节构成,即7×2 5 6 + 1 8 4 = 1 9 7 6。4 同样占两个字节,由第2、3字节构成, 0×2 5 6 + 4 = 4,2 3由第4、5字节构成, 2 3 = 0×2 5 6 + 2 3。 源代码网推荐 源代码网供稿. |


