概念区别
- 结构体(struct)
- 结构体是一种用户自定义的数据类型,它允许将不同类型的数据成员组合在一起。这些数据成员在内存中是依次存储的,每个成员都有自己独立的内存空间。就像是把不同类型的物品(如书、笔、笔记本)放在一个盒子里,每个物品都有自己的位置。
- 例如,定义一个表示学生信息的结构体:
struct Student { char name[20]; int age; float score; };
- 这里
Student
结构体包含了一个字符数组name
用来存储学生姓名,一个整型age
表示学生年龄,一个浮点型score
表示学生成绩。
- 共用体(union)
- 共用体也是一种用户自定义的数据类型,它的所有成员共享同一段内存空间。在某一时刻,只有一个成员可以被使用。这就好比一个房间,不同的人(代表不同的成员)在不同的时间使用这个房间,但同一时间只能有一个人在房间里。
- 例如,定义一个共用体:
union Data { int i; float f; char c; };
- 在这个
Data
共用体中,i
、f
和c
共享同一块内存。
- 结构体(struct)
内存分配区别
- 结构体
- 结构体所占用的内存空间是其所有成员所占内存空间之和(考虑内存对齐的情况下可能会有一些额外的空间)。例如上面的
Student
结构体,假设char[20]
占20字节,int
占4字节,float
占4字节,那么在不考虑内存对齐的情况下,Student
结构体占20 + 4+4 = 28字节。但在实际情况中,由于内存对齐的要求,可能会占用更多字节。内存对齐是为了提高CPU读取数据的效率。
- 结构体所占用的内存空间是其所有成员所占内存空间之和(考虑内存对齐的情况下可能会有一些额外的空间)。例如上面的
- 共用体
- 共用体占用的内存空间大小等于其最大成员所占的内存空间大小。对于上面的
Data
共用体,在大多数系统中,int
和float
一般占4字节,char
占1字节,所以Data
共用体占4字节,因为int
和float
占用空间较大。
- 共用体占用的内存空间大小等于其最大成员所占的内存空间大小。对于上面的
- 结构体
数据访问和使用区别
- 结构体
- 可以通过结构体变量名和成员运算符(
.
)来访问结构体中的每个成员。例如,对于struct Student stu;
这样的结构体变量定义,可以通过stu.age
来访问学生的年龄,stu.name
来访问学生的姓名等。可以同时对结构体中的多个成员进行赋值和使用。
- 可以通过结构体变量名和成员运算符(
- 共用体
- 访问共用体成员的方式和结构体类似,也是通过共用体变量名和成员运算符(
.
)。但是由于共用体成员共享内存,在某一时刻只能使用其中一个成员。如果对一个成员赋值后再对另一个成员赋值,之前成员的值可能会被覆盖。例如,对于union Data data;
,如果先data.i = 10;
,然后data.f = 3.14;
,那么data.i
的值就会被改变,因为i
和f
共享同一块内存。
- 访问共用体成员的方式和结构体类似,也是通过共用体变量名和成员运算符(
- 结构体
用途区别
- 结构体
- 适用于将相关的数据组合在一起,方便对一组数据进行整体操作。比如在处理图形界面程序中的窗口信息时,一个窗口结构体可以包含窗口的位置(坐标)、大小、颜色等多种属性,方便在程序中传递和处理窗口相关的信息。
- 共用体
- 通常用于节省内存空间或者需要用多种方式解释同一块内存数据的情况。例如,在网络编程中,接收的数据可能根据不同的协议头部信息被解释成不同的数据类型,这时可以使用共用体来根据需要解释内存中的数据。
- 结构体