联合体(union)定义
C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖重叠。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
与结构体的定义形式类似,联合体的定义形式也分为如下几种:
union 共用体名
{
数据类型 成员名;
数据类型 成员名;
...
} 变量名;
union foo
{
char s[10];
int i;
}a,b;
union 共用体名
{
数据类型 成员名;
数据类型 成员名;
...
};
union 共用体名 变量名;
union foo
{
char s[10];
int i;
};
union foo a;
typedef union
{
数据类型 成员名;
数据类型 成员名;
...
}共用体名;
共用体名 变量名;
typedef union
{
char s[10];
int i;
}foo;
foo a;
与结构体定义类似,用得最多的联合体定义方式为:
typedef union _共用体名
{
数据类型 成员名;
数据类型 成员名;
...
}共用体名,*P共用体名;
共用体名 变量名;
比如:
typedef union _foo
{
char s[10];
int i;
}foo,*pfoo;
foo a;
在联合体定义与使用的时候,需要注意下面几点:
1. union中可以定义多个成员,union的大小由最大的成员的大小决定。
2. union成员共享同一块大小的内存,一次只能使用其中的一个成员。
3. 对某一个成员赋值,会覆盖其他成员的值,因为他们共享一块内存。
4. union中各个成员存储的起始地址都是相对于基地址的偏移都为0。
下面是联合体的使用示例:
typedef union _foo
{
char s[20];
int i;
}foo,*pfoo;
int main(void)
{
foo a;
a.i = 100;
printf(“a.i:%d, a.s:%s\n”, a.i, a.s);
strcpy(a.s, “hello world!”);
printf(“a.i:%d,
a.s:%s\n”, a.i, a.s);
printf(“&a.i:%p,&a.s%p\n”, &a.i, &a.s);
printf(“sizeof(a)=%d\n”, sizeof(a));
return 0;
}