[c/c++] programming之路(17)、高级指针

一、二级指针

二级指针的作用:
1.函数改变外部变量指针
2.外挂改变一个指针的值

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void main(){
 5     int a = 10;
 6     int b = 20;
 7     int *p1 = &a;
 8     int *p2 = &b;
 9     int **pp = &p1;
10     printf("%d,", **pp);
11     printf("\n%x,%x,%x", p1, *pp,&a);
12     pp = &p2;
13     printf("%d,", **pp);
14     printf("\n%x,%x,%x", p2, *pp, &b);
15     printf("\n%d,%d", *p2, b);
16 
17     system("pause");
18 }

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void main(){
 5     int a[] = { 1, 2, 3, 4, 5, 6, 7 };
 6     printf("%d", sizeof(a));// 28.    C语言规定,数组地址整体大小
 7     printf("\n%d", sizeof(a)/sizeof(int));
 8     
 9     int *p = a;
10     printf("\n%d", sizeof(p));
11     //a = p + 1;  =”: 左操作数必须为左值:a是一个常量,不能作为左值
12     printf("\n%x,%x", a,p);
13     //数组名就是一个常量指针,p是变量指针,
14     //中括号可以根据指针的地址往下找出内容
15     //数组的本质就是一片连续的内存,数组名就是地址
16     for (int i = 0; i < 7; i++)
17     {
18         printf("\n%d,%x", p[i], &p[i]);
19         printf("\n%d,%x", *(p+i),p+i);
20         //p+i  p往前移动i个元素的地址
21         // *(p+i)   p往前移动i个元素
22     }
23     printf("\n\n");
24     for (int *px = a; px < a + 7; px++)
25     {
26         printf("\npx=%x,*px=%d", px, *px);
27     }
28 
29     system("pause");
30 }

二、三级指针

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 //C程序分配给全局变量内存后,才启动main函数
 5 int a=10;
 6 int *p1=&a;
 7 int b=20;
 8 int *p2=&b;
 9 
10 void change(int **pp){//新建一个二级指针,指向P2;不会改变原来指针指向的地址
11     pp=&p2;
12     printf("change pp=%x\n",pp);
13 }
14 
15 void changeA(int ***ppp){
16     *ppp=&p2;
17 }
18 
19 void main(){
20     int **pp=&p1;
21     printf("main pp=%x\n",pp);
22     change(pp);
23     printf("%d\n",**pp);
24     changeA(&pp);
25     printf("%d\n",**pp);
26     getchar();
27 }

 三、外挂(指针应用)

靶子程序

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<Windows.h>
 4 
 5 void msg(){
 6     MessageBoxA(0,"open","阿飞在泡妞",0);
 7 }
 8 
 9 int add(int a,int b){
10     system("tasklist");
11     return a + b;
12 }
13 
14 void main(){
15     int numA=100;
16     int numB=20000;
17     int *p1 = &numA;
18     int *p2 = &numB;
19     int **pp=&p1;
20     char str[5] = { 'A', 'B', 'C', 'D', 'E' };
21     char *pch=str;
22     //printf("%x,%x\n",msg,add);
23     printf("%x,%x\n",&numA,&numB); 
24     printf("&p1=%x,&p2=%x,&pp=%x,&pch=%x,str=%x\n",&p1,&p2,&pp,&pch,str);
25     while (1)
26     {
27         printf("阿飞的目标是泡%d个妞\n",numA);
28         printf("阿飞的月薪是%d元\n",numB);
29         printf("阿飞已经泡了%d个妞\n",*p1);
30         printf("阿飞希望的RMB%d元\n", **pp);
31         printf("阿飞在泡妞届的级别%c\n",*pch);
32         Sleep(25000);
33         printf("\n");
34     } 
35 
36 
37     
38     system("pause");
39 }

dll文件

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<Windows.h>
 4 _declspec(dllexport) void go(){
 5     while (1)
 6     {
 7         void(*p)()=(void(*)())0x11010f5;
 8         p();
 9         Sleep(5000);
10     }
11 }
12 
13 _declspec(dllexport) void goA(){
14     int (*p)(int,int)=(int (*)(int,int))0x1191096;
15     printf("%d\n",p(10,30));
16     system("title 马化腾");
17     system("color 5E");
18 }
19 
20 _declspec(dllexport) void goB(){
21     system("color 5E");
22     //改变两个变量:numA,numB
23     int *p1=(int *)0x43f860;
24     int *p2=(int *)0x43f854;
25     *p1=10000;
26     *p2=2147483647;
27     
28     //改变指针p1,将p1指向numA改为numB
29     int **p3=(int **)0x43f848;
30     *p3=(int *)0x43f854;
31     
32     //改变二级指针pp,将pp指向p1改为p2
33     int ***p4=(int ***)0x43f830;
34     *p4=(int **)0x43f83c;
35 
36     //改变数组指向
37     char **pp=(char **)0x43f814;
38     *pp=(char *)(0x43f820+0x1);
39 }

 

posted @ 2017-08-23 22:14  进击的小猴子  阅读(287)  评论(0编辑  收藏  举报