结构体是不同数据(包括类型或逻辑意义)的集合。在设计定义一个结构体时,要把其合理的数据组织在一块。点(.)运算符用来访问结构体成员,点运算符优先级仅次于括号。
VC6中默认的编译选项,结构体成员对齐为8字节(/Zp8)。结构体成员的偏移地址规则是,必须是结构体成员对齐字节数(/Zp?)和该成员类型长度(字符串不计数组长度,只作字符类型长度),这两者较小者的整倍数。而结构体大小则是成员对齐字符数和结构体中最大成员类型长度,这两者较小值的整倍数。比如在VC6默认选项中定义一个结构体:
struct TEMP {
char szName; // 偏移0
double dScore; // 偏移8
int nNum; // 偏移16
};
sizeof(TEMP) 等于24。
结构体可以嵌套结构体,但不能是本身。
在源码中可以用#pragma指令动态修改结构体成员对齐字节,比如:
#pragma pack(push) // 保存之前成员对齐字节数
#pragma pack(2) // 设置结构体成员对齐2字节
// 定义结构体
#pragma pack(pop) // 恢复之前成员对齐字节数
结构体点运算符公式:
obj.member = *(member type*)((int)&obj + member_offset)
可以定义一个宏获取结构体的成员偏移量:
#define GetOffset(obj,member) (size_t)&(((obj*)NULL)->member)