目录
结构
结构是一种把一些数据项组合在一起的数据结构。可以理解成将多个数据融合在了一起,看成一个整体。下面是一个例子。
struct person{
char name[50]; // 姓名
int age; // 年龄
float height; // 身高(米)
char gender; // 性别:'M'男 / 'F'女
} ;
这样我们就有了一个新的数据类型 person,后续可以使用 person 来定义新数据。例如:
struct person xiaoming = {"小明", 18, 180, 'M'};
结构体可以通过 结构名.成员 或 结构指针->成员 来访问数据。
int main()
{
struct person xiaoming = {"小明", 18, 180, 'M');
printf("小明的年龄:%d,身高:%f\n", xiaoming.age, xiaoming.height);
return 0;
}
运行结果:小明的年龄:18,身高:180.000000
联合
联合(union)是一种特殊的数据类型,允许在相同位置存储不同类型的数据,编译器负责跟踪对象的长度和对齐要求。在结构中,每个成员依次存储;而在联合中,所有成员都从偏移地址为零开始存储。也就是说,在联合中,所有成员的位置是重叠在一起的:在某一时刻,只有一个成员真正的存储在这个地址。
我们来看一个例子,下面这个联合中存储了 int、float、char[] 三种不同类型的数据,这个联合体的大小就是根据其中内存最大的 str 来分配的,占 20字节(64位下)。
union Data {
int i;
float f;
char str[20];
};
可以通过下列语法访问联合中的成员:联合名.成员 或 联合指针->成员
联合的初始化
联合变量可以被初始化,但是只能初始第一个成员,具体如下:
union{
int a;
float b;
char c[4];
}x = {5};
这样就将 x.a 初始化为5。
联合的应用
联合由于它独特的共享内存的特性,常见应用场景主要集中在内存共享和灵活数据类型处理上。下面举两个简单的例子说明一下。
场景1.节省内存空间
场景:需要交替使用多种数据类型但不同时使用的场景(如嵌入式系统、协议解析)。
示例:
union SensorData {
int raw; // 原始数据
float temp; // 温度值
char bytes[4]; // 按字节处理
};
// 同一内存区域可分别解释为int、float或字节数组
场景2.类型转换
这个是博主在实习(cpp开发)的时候实际用到的一个地址转换,当时是在跨文件操作中,无法通过单例来共享对象了,这时候博主采用的是一个联合体,里面存储了一个指针和一个char[8],通过将对象地址存储到char[8]中,然后转换给指针来实现对象的访问。
示例:
union AddressConverter {
void* ptr;
char position[8];
};
结构和联合的区别?
结构体 (struct) | 联合体 (union) | |
|---|---|---|
| 内存分配 | 成员独立存储,总大小为各成员之和(考虑对齐) | 成员共享内存,大小为最大成员的大小 |
| 存储方式 | 并行存储,所有成员同时有效 | 覆盖存储,同一时间只有一个成员有效 |
| 访问特性 | 可同时访问所有成员 | 修改一个成员会覆盖其他成员 |
| 内存效率 | 占用空间较大 | 空间高效(仅用最大成员空间) |
| 典型用途 | 数据聚合(如人员信息、数据库记录) | 类型转换、协议解析、硬件寄存器访问 |
703

被折叠的 条评论
为什么被折叠?



