指针

Tutorial: C与汇编 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 指针类型长度永远为 4 个字节
  • 源码
#include <stdio.h>

int main()
{
    char *x;
    short *y;
    int *z;
    x = (char *)1;
    y = (short *)2;
    z = (int *)3;

    return 0;
}
  • 汇编
1:    #include <stdio.h>
2:
3:    int main()
4:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,4Ch
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-4Ch]
0040101C   mov         ecx,13h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
5:        char *x;
6:        short *y;
7:        int *z;
8:        x = (char *)1;
00401028   mov         dword ptr [ebp-4],1
9:        y = (short *)2;
0040102F   mov         dword ptr [ebp-8],2
10:       z = (int *)3;
00401036   mov         dword ptr [ebp-0Ch],3
11:
12:       return 0;
0040103D   xor         eax,eax
13:   }
0040103F   pop         edi
00401040   pop         esi
00401041   pop         ebx
00401042   mov         esp,ebp
00401044   pop         ebp
00401045   ret

0019FF28  03 00 00 00 02 00 00 00 01 00 00 00
2. 关于自加自减
#include <stdio.h>

int main()
{
    char *x;
    short *y;
    int *z;
    x = (char *)1;
    y = (short *)2;
    z = (int *)3;

    x++;
    y++;
    z++;

    return 0;
}


5:        char *x;
6:        short *y;
7:        int *z;
8:        x = (char *)1;
00401028   mov         dword ptr [ebp-4],1
9:        y = (short *)2;
0040102F   mov         dword ptr [ebp-8],2
10:       z = (int *)3;
00401036   mov         dword ptr [ebp-0Ch],3
11:
12:       x++;
0040103D   mov         eax,dword ptr [ebp-4]
00401040   add         eax,1
00401043   mov         dword ptr [ebp-4],eax
13:       y++;
00401046   mov         ecx,dword ptr [ebp-8]
00401049   add         ecx,2
0040104C   mov         dword ptr [ebp-8],ecx
14:       z++;
0040104F   mov         edx,dword ptr [ebp-0Ch]
00401052   add         edx,4
00401055   mov         dword ptr [ebp-0Ch],edx

结论:一个*,自加自己的类型长度
#include <stdio.h>

int main()
{
    char ****x;
    short ****y;
    int ****z;
    x = (char ****)1;
    y = (short ****)2;
    z = (int ****)3;

    x++;
    y++;
    z++;

    return 0;
}

5:        char ****x;
6:        short ****y;
7:        int ****z;
8:        x = (char ****)1;
00401028   mov         dword ptr [ebp-4],1
9:        y = (short ****)2;
0040102F   mov         dword ptr [ebp-8],2
10:       z = (int ****)3;
00401036   mov         dword ptr [ebp-0Ch],3
11:
12:       x++;
0040103D   mov         eax,dword ptr [ebp-4]
00401040   add         eax,4
00401043   mov         dword ptr [ebp-4],eax
13:       y++;
00401046   mov         ecx,dword ptr [ebp-8]
00401049   add         ecx,4
0040104C   mov         dword ptr [ebp-8],ecx
14:       z++;
0040104F   mov         edx,dword ptr [ebp-0Ch]
00401052   add         edx,4
00401055   mov         dword ptr [ebp-0Ch],edx

结论:超过一个*, 自加自减都是 4 字节
3. 指针加减法:N * sizeof(N)
#include <stdio.h>

int main()
{
    char *x;
    short *y;
    int *z;
    x = (char *)100;
    y = (short *)100;
    z = (int *)100;

    x = x + 5;
    y = y + 5;
    z = z + 5;

    return 0;
}

5:        char *x;
6:        short *y;
7:        int *z;
8:        x = (char *)100;
00401028   mov         dword ptr [ebp-4],64h
9:        y = (short *)100;
0040102F   mov         dword ptr [ebp-8],64h
10:       z = (int *)100;
00401036   mov         dword ptr [ebp-0Ch],64h
11:
12:       x = x + 5;
0040103D   mov         eax,dword ptr [ebp-4]
00401040   add         eax,5
00401043   mov         dword ptr [ebp-4],eax
13:       y = y + 5;
00401046   mov         ecx,dword ptr [ebp-8]
00401049   add         ecx,0Ah
0040104C   mov         dword ptr [ebp-8],ecx
14:       z = z + 5;
0040104F   mov         edx,dword ptr [ebp-0Ch]
00401052   add         edx,14h
00401055   mov         dword ptr [ebp-0Ch],edx
#include <stdio.h>

int main()
{
    char ***x;
    short ***y;
    int ***z;
    x = (char ***)100;
    y = (short ***)100;
    z = (int ***)100;

    x = x + 5;
    y = y + 5;
    z = z + 5;

    return 0;
}

5:        char ***x;
6:        short ***y;
7:        int ***z;
8:        x = (char ***)100;
00401028   mov         dword ptr [ebp-4],64h
9:        y = (short ***)100;
0040102F   mov         dword ptr [ebp-8],64h
10:       z = (int ***)100;
00401036   mov         dword ptr [ebp-0Ch],64h
11:
12:       x = x + 5;
0040103D   mov         eax,dword ptr [ebp-4]
00401040   add         eax,14h
00401043   mov         dword ptr [ebp-4],eax
13:       y = y + 5;
00401046   mov         ecx,dword ptr [ebp-8]
00401049   add         ecx,14h
0040104C   mov         dword ptr [ebp-8],ecx
14:       z = z + 5;
0040104F   mov         edx,dword ptr [ebp-0Ch]
00401052   add         edx,14h
00401055   mov         dword ptr [ebp-0Ch],edx
4. 指针可以比较
#include <stdio.h>

int main()
{
    int ***x;
    int ***y;

    x = (int ***)200;
    y = (int ***)100;
    if (x > y) {
        ...
    }

    return 0;
}
Prev: 结构体 Next: &的使用