类型转换也可以根据如下理解:
例如:b->num : 将 struct A a 所指向的内存单元以 struct B b的分布方式(利用 b)取得偏移为num 的值。
结构体声明如何内存的分布,
结构体指针声明结构体的首地址,
结构体成员声明该成员在结构体中的偏移地址。
解释如下:
1、首先要明确struct B b本身有一个值(在32位机上一般是32位),这个值代表着某个内存地址,比如这个首地址值是0x30000000,由于b被定义Struct B类型,那么编译器在编译源文件时就会认为b指向的是一个struct B的结构,这个结构的内容由一段连续的内存存储,(b->num)(b->type)(b->age)在struct B的定义中肯定是存在num、type、age三个的,这几个变量对一个struct B结构的地址偏移量是固定的,也就是说只要知道一个struct B结构的起始地址,就能计算出这个结构所包含的num、type、age的地址,由于B b的地址已知(由A a强制转换而来,所以编译器知道这个地址即a的首地址),b所含的num离b的偏移量已知,那么就能通过b实现对num的取值,在编译器编译C文件的时候并不管b中的nun是否定义
2、b被定义为struct B,而B中又包含b,那么编译器就认为b所指向的结构中存在num
3、b->num如果不发生保护错误,总是能取到一个值(这个值就是对b偏移一定距离的内存单元中的值),只是这个值不能确定是否是你期望的值
4、再次提醒,变量的值是存储在内存中的,每个内存字节对应一个内存地址,而内存