struct结构体与联合union(一)

本文介绍了C语言中的联合union,它是一种特殊的数据类型,内存大小等于其成员中最大的变量长度。联合变量的访问方式与结构体类似,可以通过'->'符号来访问成员。联合可以嵌套在结构体中,其成员也可以是结构体。举例展示了如何通过联合访问数组中成员的详细操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

联合体定义

联合union是一种新的数据类型, 它是一种特殊形式的变量。联合说明和联合变量定义与结构十分相似。其形式为: 

     union 联合名{ 
          数据类型 成员名; 
          数据类型 成员名; 
          ... 
     } 联合变量名; 
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。 
下例表示说明一个联合head: 
     union head{ 
          int i; 
          char a; 

     }; 

再用已说明的联合可定义联合变量。 

例如用上面说明的联合定义一个名为he的联合变量, 可写成: 
      union head  he; 
在联合变量he中, 整型量i和字符a公用同一内存位置。 

当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大 的变量长度。 例如本例子中为int长度。

联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针。但定义为指针时, 也要用"->"符号, 此时联合访问成员可表示成: 联合名->成员名 。另外, 联合既可以出现在结构内, 它的成员也可以是结构。 

    例如: 
     struct{ 
          int age; 
          char *name; 
          union{ 
               int i; 
               char *ch; 
          }x; 

     }y[10]; 

若要访问结构变量y[1]中联合x的成员i, 可以写成: 

      y[1].x.i; 

若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成: 

      *y[2].x.ch; 
若写成"y[2].x.*ch;"是错误的。 
结构和联合的区别 
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员, 而结构的所有成员都存在。 
2. 对于联合的不同成员赋值, 将会对其它成员重写,  原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。 
下面列举一个例子及其的改造来加深对联合的认识,也有一些疑惑
 例:  
#include "stdio.h"
int main(void)  
{  
    union{                   /*定义一个联合*/  
		int i;  
		struct{             /*在联合中定义一个结构*/  
			char first;  
			int second;  
		}half;  
    }number;  
    printf("%d\n",sizeof(int));
    number.i=0x4241;         /*联合成员赋值*/  
    printf("%d\t%d\n", number.half.first, number.half.second);  
    number.half.first='a';   /*联合中结构成员赋值*/  
    number.half.second='b';  
    printf("%x\n", number.i);  
    getchar();
	return 0;
 }  
    输出结果为: 
     4
     A  B 
     6261 
可以看出: 当给i赋值后, 其低八位也就是first和second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八 位。
而稍微将上述例子改一下:
#include "stdio.h"
int main(void)  
{  
    union{                   /*定义一个联合*/  
		int i;  
		struct{             /*在联合中定义一个结构*/  
			char first;  
			int second;  
		}stu;  
    }number;  
	printf("%d\n",sizeof(int));
    number.i=0x4241;         /*联合成员赋值*/  
    printf("%d\t%d\n", number.stu.first, number.stu.second);  
    number.stu.first='a';   /*联合中结构成员赋值*/  
    number.stu.second='b';  
    printf("%x\n", number.i);  
    getchar();
	return 0;
 }  
输出结果:
4
65   -858993460
4261
因为当i赋值0x4241时候,最低字节被0x41填,第二字节被ox42填,但因为此时union中是char 及int,这时候,char还是对应最低的字节,而int由于只有int的最低字节为0x42,但高位的我们没有给值,所以给出的数字就比较奇怪了,但是有个疑惑就是自己认为该int型的最低字节应该是0x42才对啊,你如果用%x打印下他,显示的是cccccccc,最后一位并不是想象的0x42?
而当联合体的char 赋值为0x61(即是a),第二个的int被赋予了0x62 但打印出来怎么会是之前的0x42?而不是现在的0x62?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值