共用体详解

什么是共用体?

概述:一个地址放不同东西,但地址只有一个,故只能用谁谁上,没用就走。

在某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

如何定义共用体?

union 共用体名
{
    成员表列
}变量表列;        //注意加分号

举例:
union Data
{
    int i;
    char ch;
    float f;    //i,ch,f可以存放到同一段存储单元中

}a,b,c;        //变量

共用体与结构体类比:

结构体:

由一系列具有相同数据类型或者不同数据类型组成的集合,数据彼此有联系,数据共同组成一个整体,结构体的每一个成员都具有内存空间

共用体:

有一系列具有相同数据类型或者不同数据类型的数据组成的集合,数据互斥关系,共用体所有的成员共同使用一份内存空间,其中空间的大小是按照共用体成员中所占的最大的内存空间的成员的空间进行分配

共用体中有数组类型成员,保证基本数据类型的成员数据完整,最终共用体所占的内存空间是基本数据类型的(内存空间所占最大的成员)整数倍

换言之:共用体的大小就是最宽基本成员大小,但是要整除最宽基本成员大小

举例:

union str
{
    char num[13];
    int a;
};

int main()
{
    cout << sizeof (union str);
    return 0;
}
        该运行结果为16,并非13,最大确实13,但是得是整数倍,故只能是16

#用法中的重中之重:注意事项:

1、可以对共用体变量初始化,但初始化表中只能有一个常量

union Data
{

    int i;        
    char ch;    
    float f;                     //i,ch,f可以存放于同一段存储单元中

}a = {1, 'a', 1.5 };            //错误:不能初始化3个成员,他们占用同一段存储单元

union Data a = {16};             //正确:对第一个成员初始化

union Data a = {.ch = 'j'};      //C99允许对指定的一个成员初始化

void Test_union(void)        //测试函数
{
	union TEST
	{
		int a;
		char b;
		float c;

	}first,second,third;
    //first,second,third为此共用体的三个变量

    //a,b,c仅为成员,且同一时刻只能有一个成员被赋值
!!!!!!!!!!!!!!!
    //即内存分别分配在first,second,third,三个变量里,a,b,c无内存分配
!!!!!!!!!!!!!!!
    //(建议类比结构体)

	first.a = 10;
	cout << first.a << endl;
	cout << (void*) & first.a << endl;
	first.b = 'a';
	cout << first.b << endl;
	cout << (void*) & first.b << endl;
	cout << endl;
	second.a = 5;
	cout << second.a << endl;
	cout << (void*)&second.a << endl;
	second.b = 'b';
	cout << second.b << endl;

	cout << (void*)&second.b << endl;
        
        

}

2、共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代

3、共用体变量不能直接引用

4、改变共用体中的一个成员,就会改变整个共用体

5、共用体变量的地址和它的成员的地址都是同一个地址

6、共用体在任意一个时刻,只有一个成员有意义。并且,对共用体变量赋值,在任意一个时刻只能对一个变量赋值

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值