C语言 指针偏移量计算

发布时间 2024-01-11 08:41:27作者: 王景迁
#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;
}