c语言反汇编中的这个问题怎么解决?

img

直接指向结构体第一个成员就可以了,为什么还一级偏移和二级偏移还有数组数据结构呢?

这个一级和二级和数组结构偏移是怎么来的,为什么要这样写?能写个代码吗我运行调试理解下。

#include <stdio.h>

struct node {
    char no[20];   //学号
    char name[20]; //姓名
    char sex[5];   //性别
    int age;       //年龄
};

struct node *p; // 申明一个全局指针
int main() {
    struct node stu;   //定义一个结构体变量,类型是node结构体
    p = &stu;    // 让全局指针p指向 结构体变量stu的首地址
    printf("stu address = %p, p address = %p\n", &stu, p); //打印stu的地址和p指向的地址,地址一样则指向了同一块区域
    printf("p->name address = %p\n", p->name);  //一级偏移,通过全局指针p访问结构体stu中name成员,打印p指向的地址
    printf("p->name[8] address = %p\n", &(p->name[1]));  // 二级偏移,通过全局指针p访问结构体stu中name成员中下标为1的字符,打印p->name[1]的地址

    int arr[1000]; // 定义一个数组,此时arr的地址就是基址, arr+4中4就是偏移
    printf("arr address = %p\n", arr);  //打印arr的地址
    printf("arr + 4 address = %p, arr[4] address = %p\n", arr + 4, &arr[4]); // 此时arr+4就是访问arr[4]的地址,可以看到两个地址是相等的
    return 0;
}