#include <stdio.h>
// 定义结构体
struct student {
int id;
char name[20];
union score {
float math;
float english;
} s;
};
int main() {
struct student stu = {1, "Tom", {90.5}};
struct student *stuPtr = &stu;
// 使用指针访问结构体和联合体成员并打印
printf("id: %d\n", stuPtr->id);
printf("math: %f\n", stuPtr->s.math);
return 0;
}
指针访问结构体和联合体成员的不同
- 语法层面:
- 结构体:使用
->
操作符,例如 stuPtr->id
,->
左边是结构体指针,右边是结构体成员名。这是因为结构体指针指向结构体整体,通过 ->
操作符可以访问结构体内部的成员。
- 联合体:由于联合体是结构体的一种特殊形式,在结构体内部访问联合体成员时,同样使用
->
操作符,如 stuPtr->s.math
。先通过结构体指针访问到联合体成员 s
,再通过 .
操作符访问联合体内部的具体成员 math
(这里 s
是联合体类型的成员,不是指针,所以用 .
)。
- 内存布局层面:
- 结构体:结构体的成员在内存中是顺序存储的。在上述
struct student
中,id
先占用 4 个字节(假设 int
为 4 字节),然后是 name
数组占用 20 个字节,最后是 union score
占用 4 个字节(假设 float
为 4 字节)。结构体的大小是其所有成员大小之和(考虑内存对齐)。
- 联合体:联合体所有成员共享同一块内存空间,其大小为联合体中最大成员的大小。在
union score
中,math
和 english
共享 4 个字节的内存空间,同一时间只有一个成员有效。 所以在通过指针访问联合体成员时,要清楚当前有效的是哪个成员。