5.6.1 由结构体指针进而访问各元素的原理
(1)通过结构体整体变量来访问其中各个元素,本质上是通过指针方式来访问的,形式上是通过.的方式来访问的(这时候其实是编译器帮我们自动计算了偏移量)。
5.6.2 offsetof宏
(1)offsetof宏的作用:用offsetof宏来计算结构体中某个元素和结构体首地址的偏移量(其实质是通过编译器来帮我们计算)。
(2)offsetof宏的原理:我们虚拟一个type类型结构体变量,然后用type.member的方式来访问那个member元素,继而得到member相对于整个变量首地址的偏移量。
(3)学习思路:第一步先学会用offsetof宏,第二步
(TYPE *)0 :这是一个强制类型转换,把0地址强制类型转换成一个指针,这个指针指向一个TYPE类型的结构体变量。(实际上这个结构体变量可能不存在,但是只要我不去解引用,这个指针就不会出错)。
((TYPE *)0)->MEMBER :(TYPE *)0是一个TYPE类型结构体变量的指针,通过指针来访问这个结构体变量的member元素。
&((TYPE *)0)->MEMBER:意义就是得到member元素的地址。但是因为整个结构体变量的首地址是0.所以得到member元素的地址也就得到了member元素相对于结构体变量开始地址偏移量。
#include <stdio.h>
struct mystruct
{
char a;
int b;
short c;
};
#define offsetof(TYPE,MEMBER)((size_t)&((TYPE *)0)->MEMBER)
int main(void)
{
struct mystruct s1;
s1.b = 12;