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;
}