结构体(struct)和共用体(union)都是用于组合多个不同类型的数据成员,但它们在内存存储方式和数据访问方式上存在差异。以下是结构体和共用体之间的主要区别:
结构体(struct):
内存布局:结构体的每个成员都分配独立的内存空间,各成员在内存中按照定义的顺序依次排列。
内存占用:结构体的大小等于各成员大小之和,可能会有额外的填充字节以保持对齐。
数据隔离:不同成员之间的数据相互独立,修改一个成员不会影响其他成员。
使用场景:结构体适用于组合和管理多个关联的数据项,每个成员存储不同类型的数据。
共用体(union):
内存布局:共用体的所有成员共享同一块内存空间,不同成员的值使用相同的内存位置。
内存占用:共用体的大小等于最大成员的大小,因为所有成员共享同一块内存。
数据共享:不同成员共享同一块内存,修改一个成员可能会影响其他成员的值。
使用场景:共用体适用于存储不同类型的数据,在不同的情况下只需要访问其中一种类型的数据。
下面举个例子
Struct和union的使用。
Struct 狗
{
Int 白狗;
Int 黑狗;
Int 花狗;
}struct_dog;
这里狗类中,白狗,黑狗,花狗每一种狗都有一个家,都有自己的小窝。
但是共用体就不一样了
union狗1
{
Int 白狗1;
Int 黑狗1;
double 花狗1;
}struct_dog1;
这里的狗类,只有一个家,一个窝,谁要想住窝就得打架,打赢了把那两个狗杀死他就可住了,可以理解为适者生存。每一次的数据更新这里的狗都会进行打架,把其他两个狗杀死。
说白了结构体是有几个成员就分配几次内存地址;共用体是以共用体中的数据占有最大的来分配,比如刚才union狗1的double 占用8个字节,那么这个狗窝就是8个字节,不会是小的,是取最大的。
不知道大家明白了嘛,欢迎交流
代码下面的可以看看
#include <stdio.h>
// 假设共用体中需要保存整数或浮点数
typedef union {
struct {
int intValue;
float floatValue;
} numericData;
char stringValue[20]; // 用于保存字符串
} ValueUnion;
int main() {
ValueUnion value;
// 设置整数值
value.numericData.intValue = 42;
printf("Integer value: %d\n", value.numericData.intValue);
// 设置浮点数值
value.numericData.floatValue = 3.14;
printf("Float value: %.2f\n", value.numericData.floatValue);
// 设置字符串值
snprintf(value.stringValue, sizeof(value.stringValue), "Hello, World!");
printf("String value: %s\n", value.stringValue);
printf("Float value: %.2f\n", value.numericData.floatValue);
printf("Integer value: %d\n", value.numericData.intValue);
return 0;
}
但是一般不跟上面这么用,一般在共用体中设置的内存一样大,而不是一大一小。文章来源:https://www.toymoban.com/news/detail-662813.html
#include <stdio.h>
#include<iostream>
// 假设共用体中需要保存整数或浮点数
typedef union {
int a;
int b; // 用于保存字符串
} ValueUnion;
int main() {
ValueUnion value;
value.a = 1;
value.b = 2;
std::cout<<value.b<<std::endl;
return 0;
}
一般这样用, int a; int b; ,实际是一个别名的意思,如果改a的值那么b的值也变了,因为他俩的狗窝一样大,谁后进去算谁的,因为两个家一样大小的。文章来源地址https://www.toymoban.com/news/detail-662813.html
到了这里,关于Struct和union的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!