小甲鱼 P51 共用体
共用体(联合体,联合类型)
定义方式:
共用体的所有成员共享同一个内存地址!!
不能同时打印共用体三者的值!!
#include <stdio.h>
#include <string.h>
//共用体,共用同一个内存地址
union Test
{
int i;
double pi;
char str[6];
};
int main(void)
{
union Test test;
test.i = 520;
test.pi = 3.14;
strcpy(test.str, "FishC");
printf("add od test.i: %p\n", &test.i);
printf("add od test.pi: %p\n", &test.pi);
printf("add od test.str: %p\n", &test.str);
//只有最后一个成员str的值打印才正确,因为3个成员都是引用同一个内存地址
//对它们三个赋值,会导致互相的覆盖
//第二个成员打印3.13,好像差不多正确,实际打印错误
//double占8个字节,第三个char是占6个字符,所以并没有完全覆盖8个字节的double pi
printf("test.i: %d\n", test.i);
printf("test.pi: %.2f\n", test.pi);
printf("test.str: %s\n", test.str);
return 0;
}
修改一下代码:
(每一刻只能使用其中一个成员,而不能同时使用它们 )
#include <stdio.h>
#include <string.h>
//共用体,共用同一个内存地址
union Test
{
int i;
double pi;
char str[10];
};
int main(void)
{
union Test test;
test.i = 520;
test.pi = 3.14;
strcpy(test.str, "FishC.com");
printf("add od test.i: %p\n", &test.i);
printf("add od test.pi: %p\n", &test.pi);
printf("add od test.str: %p\n", &test.str);
//只有最后一个成员str的值打印才正确,因为3个成员都是引用同一个内存地址
//对它们三个赋值,会互相的覆盖
//打印第一个和第二个成员会打印错误
//double占8个字节,第三个char是占10个字符,所以完全覆盖double pi
//每一刻只能使用其中一个成员,而不能同时使用它们
printf("test.i: %d\n", test.i);
printf("test.pi: %.2f\n", test.pi);
printf("test.str: %s\n", test.str);
printf("size of test: %d\n", sizeof(test));
return 0;
}
结果:
定义共用体类型变量
定义共用体跟定义结构体的语法相似,你可以先声明一个共用体类型,再定义共用体变量:
union date
{
int i;
char ch;
float f;
};
union data a, b, c;
也可以在声明的同时定义共用体变量:
union date
{
int i;
char ch;
float f;
}a, b, c;
初始化共用体
共用体,同一时间只能存放一个成员值,所以不要试图同时初始化多个成员