一、二级指针

二级指针的作用:
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. 【CF961G】Partitions 第二类斯特林数

    [CF961G]Partitions 题意:给出n个物品,每个物品有一个权值$w_i$,定义一个集合$S$的权值为$W(S)=|S|\sum\limits_{x\in S} w_x$,定义一个划分的权 ...

  2. python nose测试框架全面介绍十二 ----用例执行顺序打乱

    在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...

  3. 进程锁Lock

    例1: 10个人去买票,先去查询余票,有票就去购买.代码如下: # ticket.py {"ticket": 1} # 只有一张票 import json import time ...

  4. react 使用hooks

    react hooks文档 λ yarn add react@16.7.0-alpha.2 λ yarn add react-dom@16.7.0-alpha.2 设置 state import Re ...

  5. 【Java线程安全】 — 常用数据结构及原理(未完结)

    本文主要记录自己对于多线程安全的学习,先来记几个线程安全模型. 首先最重要的当然是volatile和AQS了: 我们知道,整个java.cuncurrent包的核心就是volatile,CAS加自旋悲 ...

  6. mysql limit 性能问题分析

    问题重现 // todo 参考文章: MySQL 单表分页 Limit 性能优化 Scalable MySQL: Avoid offset for large tables 证明为什么用limit时, ...

  7. 补充:ajax post 方式请求

    1. 什么是ajax Ajax: asynchronous  javascript  and  xml (异步js和xml) 其是可以与服务器进行(异步/同步)交互的技术之一. ajax的语言载体是j ...

  8. PM2.5环境检测系统的设计与分析

    PM2.5环境检测系统的设计与分析   摘要: 大气颗粒物污染对人类健康和生态环境造成了很大的影响,这让人们逐渐重视起对细颗粒物PM2.5检测技术的研究.本文阐述了PM2.5浓度检测的五种方法,在对上 ...

  9. Linux 安装mysql mariadb配置

    CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server ...

  10. torch.nn.Embedding

    自然语言中的常用的构建词向量方法,将id化后的语料库,映射到低维稠密的向量空间中,pytorch 中的使用如下: import torch import torch.utils.data as Dat ...