zoukankan      html  css  js  c++  java
  • [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("
    %x,%x,%x", p1, *pp,&a);
    12     pp = &p2;
    13     printf("%d,", **pp);
    14     printf("
    %x,%x,%x", p2, *pp, &b);
    15     printf("
    %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("
    %d", sizeof(a)/sizeof(int));
     8     
     9     int *p = a;
    10     printf("
    %d", sizeof(p));
    11     //a = p + 1;  =”: 左操作数必须为左值:a是一个常量,不能作为左值
    12     printf("
    %x,%x", a,p);
    13     //数组名就是一个常量指针,p是变量指针,
    14     //中括号可以根据指针的地址往下找出内容
    15     //数组的本质就是一片连续的内存,数组名就是地址
    16     for (int i = 0; i < 7; i++)
    17     {
    18         printf("
    %d,%x", p[i], &p[i]);
    19         printf("
    %d,%x", *(p+i),p+i);
    20         //p+i  p往前移动i个元素的地址
    21         // *(p+i)   p往前移动i个元素
    22     }
    23     printf("
    
    ");
    24     for (int *px = a; px < a + 7; px++)
    25     {
    26         printf("
    px=%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
    ",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
    ",pp);
    22     change(pp);
    23     printf("%d
    ",**pp);
    24     changeA(&pp);
    25     printf("%d
    ",**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
    ",msg,add);
    23     printf("%x,%x
    ",&numA,&numB); 
    24     printf("&p1=%x,&p2=%x,&pp=%x,&pch=%x,str=%x
    ",&p1,&p2,&pp,&pch,str);
    25     while (1)
    26     {
    27         printf("阿飞的目标是泡%d个妞
    ",numA);
    28         printf("阿飞的月薪是%d元
    ",numB);
    29         printf("阿飞已经泡了%d个妞
    ",*p1);
    30         printf("阿飞希望的RMB%d元
    ", **pp);
    31         printf("阿飞在泡妞届的级别%c
    ",*pch);
    32         Sleep(25000);
    33         printf("
    ");
    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
    ",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 }

  • 相关阅读:
    什么是守护线程?
    如何优雅地停止一个线程?
    如何创建、启动 Java 线程?
    什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
    并行是什么意思?与并发的区别是什么?
    并发编程的缺点?
    BZOJ_3058_四叶草魔杖_kruscal+状压DP
    BZOJ_3476_[Usaco2014 Mar]The Lazy Cow_扫描线+切比雪夫距离
    BZOJ_1511_[POI2006]OKR-Periods of Words_KMP
    BZOJ_3479_[Usaco2014 Mar]Watering the Fields_Prim
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7418530.html
Copyright © 2011-2022 走看看