[c/c++] programming之路(17)、高级指针
一、二级指针
二级指针的作用:
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)、高级指针的更多相关文章
- GO语言的进阶之路-Golang高级数据结构定义
GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...
- Scala进阶之路-Scala高级语法之隐式(implicit)详解
Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...
- 《C与指针》——高级指针话题
指针真是让人又爱又恨..... 首先还是先来看一下C语言中的高级指针声明.不要被表面迷惑最重要. /* ** <C和指针>——高级指针话题 */ int i; //定义一个整型变量 int ...
- C++(指针和高级指针)-上篇
[在指针中存储地址] int *pAge=nullptr; //将PAge声明为int指针,即用于存储int变量的地址 如果将指针初始化为0或者NUll,以后必须将变量的地址赋给它,如下例代码: ; ...
- [c/c++] programming之路(19)、数组指针
一.指针运算 #include<stdio.h> #include<stdlib.h> void main0(){ ; int *p=&a; printf());//变 ...
- [c/c++] programming之路(16)、指针
一.调戏百度云管家 #include<stdlib.h> #include<windows.h> _declspec(dllexport) void go(){ ){ Shel ...
- C和指针 第十三章 高级指针话题
高级声明: int (*f)(); 这里声明有两个括号,第二个括号是函数调用,第一个括号是聚组作用.(*f)是一个函数,所以f是指向返回整型的函数的指针.程序中的每个函数都位于,内存中某个位置,所以存 ...
- C语言--- 高级指针2(结构体指针,数组作为函数参数)
一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针 结构体: typedef struct stu{ char name[ ...
- [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle)
本文介绍 MVC 4 提供的一个新特性:捆绑(Bundle),一个在 View 和 Layout 中用于组织优化浏览器请求的 CSS 和 JavaScript 文件的技术. 本文目录 了解VS默认加 ...
随机推荐
- GO语言-基础语法:条件判断
1. IF判断(aa.txt内容:asdfgh.bb.txt内容:12345) package main import ( "io/ioutil" "fmt" ...
- python基础类型—字典
字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必 ...
- rails 杂记 - erb 中的 link_to 的 ActiveRecord 与 render 中的 partial
路由及路由参数 <%= link_to 'My Blog', {controller: 'articles', demo: "lidsi"}, class: "bl ...
- 关于vue-cli创建项目(小白)
vue-cli,都说是vue脚手架,一般cli是命令行的意思,一看就知道与node有关,其实脚手架是建筑工用的工具,给工人踩在上面干活的,这里借用它的意思,我觉得应该叫vue平台工具大家更容易懂,毕竟 ...
- Python学习之旅(二十二)
Python基础知识(21):IO编程 一.文件读写 读写文件就是请求操作系统打开一个文件对象(文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象 ...
- 清除 System.Web.Caching.Cache 以"xxx"开头的缓存
public static void ClearStartCache(string keyStart) { List<string> cacheKeys = new List<str ...
- ECMAScript基础
概念: 1):区分大小写 2):变量是弱类型的. 3):每行结尾的分号可有可无 4):注释与Java,C和PHP语言的注释相同 5):括号表明代码块 原始值:是存储在栈中的简单数据段,也就是说他们的值 ...
- WebService,ESB笔记
一.WebService是什么? WebService,是RPC的一样实现方式. RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算 ...
- [dpdk][hotplug] DPDK网卡设备热插拔
dpdk pci网卡设备的热插拔. 样例程序如下: ... ... static int driverctl(char* pci) { int pid; pid = fork(); ) { execl ...
- LeetCode 448 Find All Numbers Disappeared in an Array 解题报告
题目要求 Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice a ...