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]
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]
00401034 mov dword ptr [ebp-8],ecx
7: int **p2 = *(p3);
00401037 mov edx,dword ptr [ebp-8]
0040103A mov eax,dword ptr [edx]
0040103C mov dword ptr [ebp-0Ch],eax
8: int *p1 = *(p2);
0040103F mov ecx,dword ptr [ebp-0Ch]
00401042 mov edx,dword ptr [ecx]
00401044 mov dword ptr [ebp-10h],edx
9: int p = *(p1);
00401047 mov eax,dword ptr [ebp-10h]
0040104A mov ecx,dword ptr [eax]
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]
0040D432 mov dword ptr [ebp-8],eax
7: *(p) = 2;
0040D435 mov ecx,dword ptr [ebp-8]
0040D438 mov dword ptr [ecx],2
8: printf("%d\n", x);
0040D43E mov edx,dword ptr [ebp-4]
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;
0040D448 mov dword ptr [ebp-4],1
6: printf("%d %d\n", p[0], *p);
0040D44F mov eax,dword ptr [ebp-4]
0040D452 mov ecx,dword ptr [eax]
0040D454 push ecx
0040D455 mov edx,dword ptr [ebp-4]
0040D458 mov eax,dword ptr [edx]
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;
0040D448 mov dword ptr [ebp-4],1
6: printf("%d %d\n", p[0][0], **p);
0040D44F mov eax,dword ptr [ebp-4]
0040D452 mov ecx,dword ptr [eax]
0040D454 mov edx,dword ptr [ecx]
0040D456 push edx
0040D457 mov eax,dword ptr [ebp-4]
0040D45A mov ecx,dword ptr [eax]
0040D45C mov edx,dword ptr [ecx]
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]
0040D452 mov ecx,dword ptr [eax+4]
0040D455 mov edx,dword ptr [ecx+8]
0040D458 push edx
0040D459 mov eax,dword ptr [ebp-4]
0040D45C mov ecx,dword ptr [eax+4]
0040D45F mov edx,dword ptr [ecx+8]
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;
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];
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