C语言共用体(Union)完整使用攻略
共用体(Union)是C语言中一种特殊的数据类型,与结构体(Struct)类似,也是一种复合类型。共用体允许不同的数据类型在相同的内存空间里互相转换使用,这意味着在同一时间只能保存相同的数据类型,但可以在不同的时间存储不同的数据类型。
创建共用体
共用体和结构体的方式非常相似,可以使用关键字union
来定义共用体,例如:
union Data {
int i;
float f;
char str[20];
} variable;
这里定义了一个名为Data
的共用体,它包含了相同的内存空间用于存储一个整数、一个浮点数以及一个字符串类型的字符数组。定义后,可以声明共用体变量:
union Data {
int i;
float f;
char str[20];
} variable;
int main() {
variable.i = 10; // i的值被设置为10
printf("variable.i 的值: %d\n", variable.i);
variable.f = 3.14; // 把浮点数值赋给变量f
printf("variable.f 的值: %.2f\n", variable.f);
strcpy(variable.str, "Hello World!"); // 把字符串赋给变量str
printf("variable.str 的值: %s\n", variable.str);
return 0;
}
运行结果:
variable.i 的值: 10
variable.f 的值: 3.14
variable.str 的值: Hello World!
可以看到,不同类型的数据存储在同一个内存空间内,并依次进行访问。
访问共用体的成员
共用体的成员可以像访问结构体成员一样访问,使用点运算符访问共用体成员,例如:
union Data {
int i;
float f;
char str[20];
} variable;
int main() {
variable.i = 10;
printf("variable.i 的值: %d\n", variable.i);
variable.f = 3.14;
printf("variable.f 的值: %.2f\n", variable.f);
strcpy(variable.str, "Hello World!");
printf("variable.str 的值: %s\n", variable.str);
printf("%lu\n", sizeof(variable)); // 打印共用体variable的大小
return 0;
}
运行结果:
variable.i 的值: 10
variable.f 的值: 3.14
variable.str 的值: Hello World!
20
可以看到,所有成员共用一个内存空间,它们的地址是相同的。由于共用体的大小等于最大成员的大小,所以共用体的大小为20字节(4字节的整数。4字节的浮点数和20字节长度的字符串中最大的是20,因此共用体的大小是20字节)。
共用体的实际应用场景
共用体可以在编写需要相对较少的代码和内存的程序时非常有用,因为它们允许你以多种方式引用相同的内存位置。以下是两个使用共用体的实例:
示例一
假设有一个具有两个字段的结构,其中“类型”(int)字段是0时是邮政编码,而“类型”(int)字段是1时是移动电话号码。可以使用共用体来定义该结构,如下所示:
union Contact {
int zip_code;
int phone_number;
};
struct Person {
char name[64];
union Contact contact;
int contact_type;
};
int main () {
struct Person p;
strcpy(p.name, "John");
p.contact_type = 0;
p.contact.zip_code = 518057;
printf("Name: %s\n", p.name);
printf("Zip Code: %d\n", p.contact.zip_code); // 只有在contact_type为0时,zip_code的值才是有效的
// p.contact.phone_number = "1234567890"; 当contact_type为1时使用phone_number
return 0;
}
运行结果:
Name: John
Zip Code: 518057
示例二
共用体也可以用来在不同的数据类型之间转换:
union Converter {
float f;
int i;
};
int main() {
union Converter c;
c.f = 3.14;
printf("浮点数 f = %f\n", c.f);
printf("整数 i = %d\n", c.i);
c.i = 1234;
printf("浮点数 f = %f\n", c.f);
printf("整数 i = %d\n", c.i);
return 0;
}
运行结果:
浮点数 f = 3.140000
整数 i = 1078523331
浮点数 f = 1234.000000
整数 i = 1234
在以上示例中,共用体用于将同一内存位置中的浮点数和整数相互转换,这种类型的操作对于底层的数据结构操作非常有用,例如:htonl
和ntohl
函数就是用于将大端和小端字节序之间转换整数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 共用体 - Python技术站