科锐课堂笔记:2017/3/17 结构体

  结构体是不同数据(包括类型或逻辑意义)的集合。在设计定义一个结构体时,要把其合理的数据组织在一块。点(.)运算符用来访问结构体成员,点运算符优先级仅次于括号。


  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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值