一、二级指针

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

 #include<stdio.h>
#include<stdlib.h> void main(){
int a = ;
int b = ;
int *p1 = &a;
int *p2 = &b;
int **pp = &p1;
printf("%d,", **pp);
printf("\n%x,%x,%x", p1, *pp,&a);
pp = &p2;
printf("%d,", **pp);
printf("\n%x,%x,%x", p2, *pp, &b);
printf("\n%d,%d", *p2, b); system("pause");
}

 #include<stdio.h>
#include<stdlib.h> void main(){
int a[] = { , , , , , , };
printf("%d", sizeof(a));// 28. C语言规定,数组地址整体大小
printf("\n%d", sizeof(a)/sizeof(int)); int *p = a;
printf("\n%d", sizeof(p));
//a = p + 1; =”: 左操作数必须为左值:a是一个常量,不能作为左值
printf("\n%x,%x", a,p);
//数组名就是一个常量指针,p是变量指针,
//中括号可以根据指针的地址往下找出内容
//数组的本质就是一片连续的内存,数组名就是地址
for (int i = ; i < ; i++)
{
printf("\n%d,%x", p[i], &p[i]);
printf("\n%d,%x", *(p+i),p+i);
//p+i p往前移动i个元素的地址
// *(p+i) p往前移动i个元素
}
printf("\n\n");
for (int *px = a; px < a + ; px++)
{
printf("\npx=%x,*px=%d", px, *px);
} system("pause");
}

二、三级指针

 #include<stdio.h>
#include<stdlib.h> //C程序分配给全局变量内存后,才启动main函数
int a=;
int *p1=&a;
int b=;
int *p2=&b; void change(int **pp){//新建一个二级指针,指向P2;不会改变原来指针指向的地址
pp=&p2;
printf("change pp=%x\n",pp);
} void changeA(int ***ppp){
*ppp=&p2;
} void main(){
int **pp=&p1;
printf("main pp=%x\n",pp);
change(pp);
printf("%d\n",**pp);
changeA(&pp);
printf("%d\n",**pp);
getchar();
}

三、外挂(指针应用)

靶子程序

 #include<stdio.h>
#include<stdlib.h>
#include<Windows.h> void msg(){
MessageBoxA(,"open","阿飞在泡妞",);
} int add(int a,int b){
system("tasklist");
return a + b;
} void main(){
int numA=;
int numB=;
int *p1 = &numA;
int *p2 = &numB;
int **pp=&p1;
char str[] = { 'A', 'B', 'C', 'D', 'E' };
char *pch=str;
//printf("%x,%x\n",msg,add);
printf("%x,%x\n",&numA,&numB);
printf("&p1=%x,&p2=%x,&pp=%x,&pch=%x,str=%x\n",&p1,&p2,&pp,&pch,str);
while ()
{
printf("阿飞的目标是泡%d个妞\n",numA);
printf("阿飞的月薪是%d元\n",numB);
printf("阿飞已经泡了%d个妞\n",*p1);
printf("阿飞希望的RMB%d元\n", **pp);
printf("阿飞在泡妞届的级别%c\n",*pch);
Sleep();
printf("\n");
} system("pause");
}

dll文件

 #include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
_declspec(dllexport) void go(){
while ()
{
void(*p)()=(void(*)())0x11010f5;
p();
Sleep();
}
} _declspec(dllexport) void goA(){
int (*p)(int,int)=(int (*)(int,int))0x1191096;
printf("%d\n",p(,));
system("title 马化腾");
system("color 5E");
} _declspec(dllexport) void goB(){
system("color 5E");
//改变两个变量:numA,numB
int *p1=(int *)0x43f860;
int *p2=(int *)0x43f854;
*p1=;
*p2=; //改变指针p1,将p1指向numA改为numB
int **p3=(int **)0x43f848;
*p3=(int *)0x43f854; //改变二级指针pp,将pp指向p1改为p2
int ***p4=(int ***)0x43f830;
*p4=(int **)0x43f83c; //改变数组指向
char **pp=(char **)0x43f814;
*pp=(char *)(0x43f820+0x1);
}

[c/c++] programming之路(17)、高级指针的更多相关文章

  1. GO语言的进阶之路-Golang高级数据结构定义

    GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...

  2. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  3. 《C与指针》——高级指针话题

    指针真是让人又爱又恨..... 首先还是先来看一下C语言中的高级指针声明.不要被表面迷惑最重要. /* ** <C和指针>——高级指针话题 */ int i; //定义一个整型变量 int ...

  4. C++(指针和高级指针)-上篇

    [在指针中存储地址] int *pAge=nullptr; //将PAge声明为int指针,即用于存储int变量的地址 如果将指针初始化为0或者NUll,以后必须将变量的地址赋给它,如下例代码: ; ...

  5. [c/c++] programming之路(19)、数组指针

    一.指针运算 #include<stdio.h> #include<stdlib.h> void main0(){ ; int *p=&a; printf());//变 ...

  6. [c/c++] programming之路(16)、指针

    一.调戏百度云管家 #include<stdlib.h> #include<windows.h> _declspec(dllexport) void go(){ ){ Shel ...

  7. C和指针 第十三章 高级指针话题

    高级声明: int (*f)(); 这里声明有两个括号,第二个括号是函数调用,第一个括号是聚组作用.(*f)是一个函数,所以f是指向返回整型的函数的指针.程序中的每个函数都位于,内存中某个位置,所以存 ...

  8. C语言--- 高级指针2(结构体指针,数组作为函数参数)

    一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[ ...

  9. [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle)

    本文介绍 MVC 4 提供的一个新特性:捆绑(Bundle),一个在  View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术. 本文目录 了解VS默认加 ...

随机推荐

  1. ubuntu中python3安装package

    1.实验环境 Ubuntu16.04x86 + python3.5 ubuntu中同时存在python2.7 和 python3.5 2.pip使用说明 sudo pip install packag ...

  2. Vue2学习笔记:计算属性(computed)

    参考:https://www.cnblogs.com/zycbloger/p/6428907.html

  3. Oracle课程档案,第五天

    集合操作 desc job_history:改变历史职位 job_history:历史表 vnion:重复值只保留一个 去除重复值 ★★ vnion all: 把所有重复值保留 不去除重复值★★ in ...

  4. python 中字符串的格式化

    # 字符串格式化name = input("name:")age = int(input("age:"))job = input("job:" ...

  5. windows环境下MySQL mysql-5.7.17-winx64 (社区服务版,community server)安装教程

    根据网上查询的资料显示,MySQ在版本5.7开始根目录下没有dada目录,需要额外的“初始化数据库”的操作自动生成data目录. 1.    下载地址: https://cdn.mysql.com// ...

  6. Saltstack如何修改主机名或者minion id

    参考:http://www.mamicode.com/info-detail-2241784.html 在生产维护的过程中,由于某种需要,可能需要给一些服务器改名,比如根据服务器的用途重新进行定义主机 ...

  7. Cardinal and Ordinal Numbers

    Cardinal Numbers Table of Cardinal Numbers Cardinal numbers from 1 through 1,000,000 1 one 11 eleven ...

  8. RoR - Expressing Database Relationships

    One-to-One Association: *一个person只对应一个personal_info *一个personal_info只属于一个person *belongs to用foreign ...

  9. 转载:Linux下解压zip乱码问题的解决(unzip)

    https://blog.csdn.net/abyjun/article/details/48344379 在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码 ...

  10. threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/dyuproject/protostuff/MapSchema$MessageFactory] with root cause

    错误记录 前几天朋友问我一个错误,顺便记录一下,关于redis 工具类,protostuff序列化报错. threw exception [Handler processing failed; nes ...