博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
60再谈指针
阅读量:7036 次
发布时间:2019-06-28

本文共 1141 字,大约阅读时间需要 3 分钟。

32位操作系统下:一个应用程序理论上的虚拟内存空间4GB内存
0000 0000 0000 0000 0000 0000 0000 0000  - 1111 1111 1111 1111 1111 1111 1111 1111
0x0000 0000 - 0xFFFF FFFF
指针的本质就是一个int类型的变量.
只不过这个变量是存放一个4字节的内存地址,并且这个int是无符号的类型,因为内存地址不存在负数.
我们平常定义的
char * l_v1
double * l_v2
int * l_v3
只是在用这个指针的时候,在内存移动一个多大的距离.
 
l_v1 = 0x 12345678
64位操作系统下:一个应用程序的虚拟内存是2的64次方内存空间.当然这只是理论.
所以指针就是8个字节的无符号整数了.
0x0000 0000 0000 0000 - 0x FFFF FFFF FFFF FFFFF
 int l_v1 = 100;
 int *l_v2 = &l_v1;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
 char l_v1[100] = "ABCDEFGHIGKLMN";
 char * l_v2 = &l_v1;
 int *l_v3 = &l_v1;
 printf("%c\n", *l_v2);
 printf("%c\n", *l_v3);
 l_v2++;
 l_v3++;
 printf("%c\n", *l_v2);
 printf("%c\n", *l_v3);
 system("pause");
}

  int l_v1 = 0;

 const int *l_v2 = &l_v1; //常量指针

 __asm {

  mov eax, dword ptr[ebp - 14h];
  mov dword ptr[eax], 64h;
 }

 printf("l_v1 is %d \n", l_v1);

 // 指针可以指向一个int类型的地址,但不可以用*l_v3修改这个内存的值.
 // mov     eax,dword ptr [ebp-14h] 
 // mov     dword ptr[eax], 64h
 // mov     dword ptr[ebp - 8h], 64h;


const int l_v1 = 0;
这只是一些语法限制,编译器不允许我们这么做.
不过如果想要绕过去,有时候可以通过指针或者内嵌汇编的方式.
跟外挂和黑客很相似.  //都是跟内存打交道.

转载于:https://www.cnblogs.com/xiaodaxiaonao/p/7912102.html

你可能感兴趣的文章
LeetCode算法题-Perfect Number(Java实现)
查看>>
maven3.1安装及配置
查看>>
待人原则
查看>>
如何熟悉一个新项目
查看>>
2018年蓝桥杯java b组第二题
查看>>
结对-贪吃蛇游戏-测试过程
查看>>
实现Servlet容器一
查看>>
Python函数式编程指南(转)
查看>>
Spring4.x所有Maven依赖
查看>>
盒子变形-盒子加padding后 变形问题,
查看>>
小程序:在{{}}中使用函数
查看>>
Transporting Data Between Database
查看>>
android网络编程之HttpUrlConnection的讲解--上传大文件
查看>>
MySQL所学所思所想
查看>>
1、Filebeat概述
查看>>
助教第一次作业
查看>>
python04
查看>>
Json 数组传值
查看>>
Entity FrameWork 6帮助类
查看>>
如何防御“神器”Mimikatz窃取系统密码?
查看>>