#include <stdio.h>
struct s {
int a;
int b;
};
int main() {
struct s s1;
// (struct s*)0表示0x0作为struct s首地址
// &((struct s*)0)->a代表a地址
// 因为struct s首地址是0,所以a地址是偏移量
// 输出0
printf("%d\n", (char*)&s1 - ((char*)&(s1.a) - (char*)&((struct s*)0)->a));
// C语言中int固定占4个字节
// 变量向前偏移4个字节作为struct s首地址
int x = 0;
struct s *s2 = (char*)&x - 4;
// struct s首地址向后偏移4个字节就是变量自己
s2->b = 10;
// 输出x = 10
printf("x = %d\n", x);
int *p1;
int *p2 = p1 + 2;
// C语言中指针占用空间和机器位数相同,64位机器占用8个字节
// 相差2个int,输出2
printf("p2 - p1 = %d\n", p2 - p1);
// char*用于计算相差的字节数
// 相差8个char,输出8
printf("p2 - p1 = %d\n", (char*)p2 - (char*)p1);
return 0;
}