结构体指针

Tutorial: C与汇编 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 定义及使用
#include <stdio.h>

struct Point
{
    int x;
    int y;
};

int main()
{
    Point p;
    Point *px = &p;
    printf("%x\n", px); // 19FF2C

    px++;
    printf("%x\n", px); // 19FF34

    return 0;
}

11:       Point p;
12:       Point *px = &p;
0040D408   lea         eax,[ebp-8]              // eax = 19FF2C
0040D40B   mov         dword ptr [ebp-0Ch],eax  // 19FF28(19FF2C),要想打印19FF28, 就 &px
13:       printf("%x\n", px);
0040D40E   mov         ecx,dword ptr [ebp-0Ch]  // ecx = 19FF2C
0040D411   push        ecx
0040D412   push        offset string "%x\n" (0042201c)
0040D417   call        printf (0040d6b0)
0040D41C   add         esp,8
14:
15:       px++;
0040D41F   mov         edx,dword ptr [ebp-0Ch]  // edx = 19FF2C
0040D422   add         edx,8                    // Point结构体默认长度为8,++加的是自身长度
0040D425   mov         dword ptr [ebp-0Ch],edx  // 19FF34
16:       printf("%x\n", px);
0040D428   mov         eax,dword ptr [ebp-0Ch]
0040D42B   push        eax
0040D42C   push        offset string "%x\n" (0042201c)
0040D431   call        printf (0040d6b0)
0040D436   add         esp,8
2. 结构体指针取值
#include <stdio.h>

struct Point
{
    int x;
    int y;
};

int main()
{
    Point p = {1, 2};
    Point *px = &p;

    int x = px->x;
    int y = px->y;

    // 也可以修改数据
    // px->x = 100

    return 0;
}

11:       Point p = {1, 2};
0040D748   mov         dword ptr [ebp-8],1
0040D74F   mov         dword ptr [ebp-4],2
12:       Point *px = &p;
0040D756   lea         eax,[ebp-8]                 // eax = 首地址
0040D759   mov         dword ptr [ebp-0Ch],eax
13:
14:       int x = px->x;
0040D75C   mov         ecx,dword ptr [ebp-0Ch]
0040D75F   mov         edx,dword ptr [ecx]        // edx = 1
0040D761   mov         dword ptr [ebp-10h],edx
15:       int y = px->y;
0040D764   mov         eax,dword ptr [ebp-0Ch]
0040D767   mov         ecx,dword ptr [eax+4]      // ecx = 2, 偏移4个字节取值
0040D76A   mov         dword ptr [ebp-14h],ecx