union关键字使用

来源:互联网 发布:加入中国籍难吗 知乎 编辑:程序博客网 时间:2024/06/06 19:08

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端口。

 

原创粉丝点击