union关键字使用

union关键字的用法与struct的用法基本一致,union仅维护数据成员中占用内存最大的一个空间,也即所有数据成员将共用一个空间,同一时间只能存储其中一个数据成员,所有的成员具有相同的起始地址。比如:

union Test

{

       char a;

       int b;

       double c;

};

32位系统中sizeof(Test)的值将为8a,b,c三个数据成员的起始地址相同,改变任何一个数据成员的值将同时改变其它的两个成员的值。

       C++中,union的成员默认属性为publicunion主要用来压缩空间。如果数据成员不可能在同一时间同时被用到,则可使用union。由于union的以上特性,如果再结和struct的位段特性,在单片机寄存器编程上带来了极大便利。下面就举一个8位单片机寄存器编程的例子:

union PORT
{
	volatile unsigned char PINALL;
	struct 
	{
		volatile unsigned char P0 :1;
		volatile unsigned char P1 :1;
		volatile unsigned char P2 :1;
		volatile unsigned char P3 :1;
		volatile unsigned char P4 :1;
		volatile unsigned char P5 :1;
		volatile unsigned char P6 :1;
		volatile unsigned char P7 :1;
	}PIN;
};

#define PORTA     ((PORT *)0X0012FF78)

void  main()
{
	PORT  PA;
	PA.PIN.P2  =  1;
	*PORTA  =  PA;
}


 

首先我们定义了一个PORT联合体,表示一个8位管脚寄存器,里面定义有两个数据成员PINALLPINPINALL表示该寄存器中的所有8个端口,对PINALL操作可以并行对所有8个端口进行操作;数据成员PIN定义为一个结构体,其内以位段的方式定义了8个数据成员P0~P7,每个数据成员仅占用1位,代表每一个端口,所以这样可以只对某一个端口进行操作而不影响其它端口。因为PINALLPIN占用相同的空间,因此,对任意一个数据成员的操作对该寄存器值的改变都有效。

另外,宏定义PORTA表示端口A的地址,在主函数中演示了对PA2端口的操作过程:首先定义一个PORT临时变量,然后对P2进行赋值,最后将该变量赋值到PORTA端口。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值