&的使用

Tutorial: C与汇编 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. & 就是给前面加一个 *, 并且类型要对应
#include <stdio.h>

int main()
{
    int p = 1;
    int *p1 = &p;
    int **p2 = &p1;
    int ***p4 = &p2;

    return 0;
}

5:        int p = 1;
00401028   mov         dword ptr [ebp-4],1
6:        int *p1 = &p;
0040102F   lea         eax,[ebp-4]
00401032   mov         dword ptr [ebp-8],eax
7:        int **p2 = &p1;
00401035   lea         ecx,[ebp-8]
00401038   mov         dword ptr [ebp-0Ch],ecx
8:        int ***p4 = &p2;
0040103B   lea         edx,[ebp-0Ch]
0040103E   mov         dword ptr [ebp-10h],edx
2. 取值运算符
#include <stdio.h>

int main()
{
    int *a = (int *)1;
    printf("%x \n", *(a + 1));
    return 0;
}

5:        int *a = (int *)1;
00401028   mov         dword ptr [ebp-4],1
6:        printf("%x \n", *(a + 1));
0040102F   mov         eax,dword ptr [ebp-4]
00401032   mov         ecx,dword ptr [eax+4] // 因为a 是指针类型,所以加4, 获取内存编号里面的值
00401035   push        ecx
00401036   push        offset string "%x \n" (00426ee8)
0040103B   call        printf (004108c0)
00401040   add         esp,8
7:        return 0;
3. *指针类型的类型
#include <stdio.h>

int main()
{
    int ****p4 = (int ****)1;
    int ***p3 = *(p4);
    int **p2 = *(p3);
    int *p1 = *(p2);
    int p = *(p1);
    return 0;
}

5:        int ****p4 = (int ****)1;
00401028   mov         dword ptr [ebp-4],1
6:        int ***p3 = *(p4);
0040102F   mov         eax,dword ptr [ebp-4]
00401032   mov         ecx,dword ptr [eax]      // [1] 中的值给ebp-8
00401034   mov         dword ptr [ebp-8],ecx
7:        int **p2 = *(p3);
00401037   mov         edx,dword ptr [ebp-8]
0040103A   mov         eax,dword ptr [edx]     // [[1]] 的值给ebp-c
0040103C   mov         dword ptr [ebp-0Ch],eax
8:        int *p1 = *(p2);
0040103F   mov         ecx,dword ptr [ebp-0Ch]
00401042   mov         edx,dword ptr [ecx]      // [[[1]]] 的值给ebp-10
00401044   mov         dword ptr [ebp-10h],edx
9:        int p = *(p1);
00401047   mov         eax,dword ptr [ebp-10h]
0040104A   mov         ecx,dword ptr [eax]      // [[[[1]]]] 的值给 ebp-14
0040104C   mov         dword ptr [ebp-14h],ecx

总结:*(指针类型) 是给指针类型减去一个*
4. 通过*修改变量的值
#include <stdio.h>

int main()
{
    int x = 1;
    int *p = &x;
    *(p) = 2;
    printf("%d\n", x);
    return 0;
}

5:        int x = 1;
0040D428   mov         dword ptr [ebp-4],1
6:        int *p = &x;
0040D42F   lea         eax,[ebp-4]             // eax = 19FF30
0040D432   mov         dword ptr [ebp-8],eax
7:        *(p) = 2;
0040D435   mov         ecx,dword ptr [ebp-8]   // ecx = 19FF30
0040D438   mov         dword ptr [ecx],2
8:        printf("%d\n", x);
0040D43E   mov         edx,dword ptr [ebp-4]   // 2
0040D441   push        edx
0040D442   push        offset string "%d\n" (0042201c)
0040D447   call        printf (0040d6d0)
0040D44C   add         esp,8
5. 指针取值的两种方式: 8() 和 [] 可以互相转换
  • 一层 *
#include <stdio.h>

int main()
{
    int *p = (int *)1;
    printf("%d %d\n", p[0], *p);

    return 0;
}


5:        int *p = (int *)1; // p[0] = *(p + 0) = *p
0040D448   mov         dword ptr [ebp-4],1
6:        printf("%d %d\n", p[0], *p);
0040D44F   mov         eax,dword ptr [ebp-4] // eax = 1
0040D452   mov         ecx,dword ptr [eax]   // ecx = [1] 两个参数一摸一样
0040D454   push        ecx
0040D455   mov         edx,dword ptr [ebp-4] // edx = 1
0040D458   mov         eax,dword ptr [edx]   // eax = [1] 两个参数一摸一样
0040D45A   push        eax
0040D45B   push        offset string "ABCDE" (0042201c)
0040D460   call        printf (0040d750)
0040D465   add         esp,0Ch
  • 二层*
#include <stdio.h>

int main()
{
    int **p = (int **)1;
    printf("%d %d\n", p[0][0], **p);

    return 0;
}

5:        int **p = (int **)1;   // p[0][0] = *(*(p+0)+0) = **p
0040D448   mov         dword ptr [ebp-4],1
6:        printf("%d %d\n", p[0][0], **p);
0040D44F   mov         eax,dword ptr [ebp-4] // eax = 1
0040D452   mov         ecx,dword ptr [eax]   // ecx = [1]
0040D454   mov         edx,dword ptr [ecx]   // edx = [[1]]  两个参数一摸一样
0040D456   push        edx
0040D457   mov         eax,dword ptr [ebp-4] // eax = 1
0040D45A   mov         ecx,dword ptr [eax]   // ecx = [1]
0040D45C   mov         edx,dword ptr [ecx]   // edx = [[1]]  两个参数一摸一样
0040D45E   push        edx
0040D45F   push        offset string "ABCDE" (0042201c)
0040D464   call        printf (0040d750)
0040D469   add         esp,0Ch
  • 两层有偏移
#include <stdio.h>

int main()
{
    int **p = (int **)1;
    printf("%d %d\n", p[1][2], *(*(p + 1) + 2));

    return 0;
}

5:        int **p = (int **)1;
0040D448   mov         dword ptr [ebp-4],1
6:        printf("%d %d\n", p[1][2], *(*(p + 1) + 2));
0040D44F   mov         eax,dword ptr [ebp-4]     // eax = 1
0040D452   mov         ecx,dword ptr [eax+4]     // ecx = [5], 对应 + 1
0040D455   mov         edx,dword ptr [ecx+8]     // edx = [D],对应 + 2
0040D458   push        edx
0040D459   mov         eax,dword ptr [ebp-4]     // eax = 1
0040D45C   mov         ecx,dword ptr [eax+4]     // ecx = [5], 对应 + 1
0040D45F   mov         edx,dword ptr [ecx+8]     // edx = [D],对应 + 2
0040D462   push        edx
0040D463   push        offset string "ABCDE" (0042201c)
0040D468   call        printf (0040d750)
0040D46D   add         esp,0Ch
  • 一层有偏移
#include <stdio.h>

int main()
{
    int *p = (int *)1;
    printf("%d %d\n", p[1], *(p + 1));

    return 0;
}

5:        int *p = (int *)1;
0040D448   mov         dword ptr [ebp-4],1
6:        printf("%d %d\n", p[1], *(p + 1));
0040D44F   mov         eax,dword ptr [ebp-4]
0040D452   mov         ecx,dword ptr [eax+4]
0040D455   push        ecx
0040D456   mov         edx,dword ptr [ebp-4]
0040D459   mov         eax,dword ptr [edx+4]
0040D45C   push        eax
0040D45D   push        offset string "ABCDE" (0042201c)
0040D462   call        printf (0040d750)
0040D467   add         esp,0Ch
  • 总结
#include <stdio.h>

int main()
{
    int i = 100;
    int *p1 = &i;
    int **p2 = &p1;
    int ***p3 = &p2;
    int ****p4 = &p3;
    int *****p5 = &p4;

    int y = *****p5;
    int z = p5[0][0][0][0][0];

    return 0;
}

5:        int i = 100;
0040D448   mov         dword ptr [ebp-4],64h
6:        int *p1 = &i;
0040D44F   lea         eax,[ebp-4]
0040D452   mov         dword ptr [ebp-8],eax
7:        int **p2 = &p1;
0040D455   lea         ecx,[ebp-8]
0040D458   mov         dword ptr [ebp-0Ch],ecx
8:        int ***p3 = &p2;
0040D45B   lea         edx,[ebp-0Ch]
0040D45E   mov         dword ptr [ebp-10h],edx
9:        int ****p4 = &p3;
0040D461   lea         eax,[ebp-10h]
0040D464   mov         dword ptr [ebp-14h],eax
10:       int *****p5 = &p4;
0040D467   lea         ecx,[ebp-14h]
0040D46A   mov         dword ptr [ebp-18h],ecx
11:
12:       int y = *****p5;                // = 100
0040D46D   mov         edx,dword ptr [ebp-18h]
0040D470   mov         eax,dword ptr [edx]
0040D472   mov         ecx,dword ptr [eax]
0040D474   mov         edx,dword ptr [ecx]
0040D476   mov         eax,dword ptr [edx]
0040D478   mov         ecx,dword ptr [eax]
0040D47A   mov         dword ptr [ebp-1Ch],ecx
13:       int z = p5[0][0][0][0][0];      // = 100
0040D47D   mov         edx,dword ptr [ebp-18h]
0040D480   mov         eax,dword ptr [edx]
0040D482   mov         ecx,dword ptr [eax]
0040D484   mov         edx,dword ptr [ecx]
0040D486   mov         eax,dword ptr [edx]
0040D488   mov         ecx,dword ptr [eax]
0040D48A   mov         dword ptr [ebp-20h],ecx
Prev: 指针 Next: 指针与数组