文章目录
引言
开文举例
//匿名结构体类型
struct
{
char c;
int i;
double d;
}s1,s2;
int main()
{
scanf("%d", s1.i);
return 0;
}
//匿名结构体类型只能用一次
//链表——结构体的自引用
struct Node
{
int data;
struct Node* next;
};//不能struct Node next,因为无法确定大小
结构体成员的对齐现象
offsetof(type,member )计算结构体成员的偏移量
对齐规则
struct S1
{
char c1;
char c2;
int n;
};
struct S2
{
char c1;
int n;
char c2;
};
struct S3
{
double d;
char c1;
int n;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
printf("%zd ", sizeof(struct S1));
printf("%zd ", sizeof(struct S2));
printf("%zd ", sizeof(struct S3));
printf("%zd", sizeof(struct S4));
return 0;
}
结果 8 12 16 32
原因
让空间小的成员尽量集中在一起
//vs调整默认对齐数
#pragma pack()
#pragma pack(1)
结构体传参
传值调用
传址调用
结构体位段
位段成员 int/ unsigned int/cahr
成员名后**:数字**
位段的位指的是二进制的位(bit)
节省空间
位段的内存分配
struct A
{
int _a : 2;
int _b : 5;
};
位段在使用过程中多个成员可能公用一个字节,不能取地址
但可以进行赋值