走进内存,走进汇编指令来看C/C++指针
来源:互联网 发布:ip网络功放系统图 编辑:程序博客网 时间:2024/05/29 06:50
讲述两点:
1、汇编下的p与*p
2、有关指针初始化的金科玉律
int* p;
p与*p,相信很多人都在这犯过迷糊,最后在死记硬背中记住了他们的区别,但实际怎样,也没有亲自到内存中看过,这里,就带您到内存中看看,到汇编中溜溜,看看p与*p的庐山真面目。
简单的程序:
2using namespace std;
3int main()
4{
5 int i = 1;
6 int* p=&i;
7}
先看汇编代码分析:
(如果您不理解为什么[ebp-4][ebp-8]处存放的是函数第一和第二个局部变量,您可先阅读《C++反汇编代码分析--函数调用》)
看到很多人问 指针p指向一个地址,那指针p有自己的地址么?答案是肯定的,通过上面的分析可以看出 p的地址是0012ff40,此地址处存放的是变量i的地址。除了通过这种方式,其实还有一种可输出的方式查看p自己的地址,int*(*q)=&p;则q存放的就是p的地址,可以自己输出查看一下。
再从内存验证以下是否真的如此:
我们已经分析出来p的地址是0012ff40,可以直接在内存观察器中看一下,如图:
最后一个小验证,呵呵,直接在变量监视器中看(其实是最简单的):
Ok,认识他们了吧,呵呵。在学习C++指针时,很多人都云里雾里的,一会儿地址一会儿值的,老师说是啥,咱就背啥,最多也就是输出看一下。我自己好奇心很强,什么事情都喜欢刨根问底,那会儿最想掰开内存看看,到底是不是这样,但那时我不会,特憋屈感觉。如果你也跟我一样的话,看那,就是了,呵呵。其实自我感觉搞懂指针还是很有用的,特别是在学习跟安全有关的东西。
2、指针的初始化
只讲一点,关于使用指针的金科玉律:一定要在对指针应用解除引用操作符(*)之前,将指针初始化一个确定的、适当的地址。
依然是一个简单的小程序:
2using namespace std;
3void main()
4{
5 int i = 1;
6 int* p;
7 //int*p = &i;
8 *p=1;
9}
//一共两种情况,一种是之前给了指针一个确定的、适当的地址,然后赋值1,一种是没有,直接赋值1
直接看汇编指令:
仅介绍指针初始化的这条金科玉律,至于初始化的其他操作,应该没有什么了,翻翻书,好多,不再赘述。
参考书籍:C++ primer plus Stephen Prata著 孙建树 韦强 译
- 走进内存,走进汇编指令来看C/C++指针
- 第一课、 走进C
- C语言 用汇编来看看变量和指针实现
- 走进汇编的世界
- 初涉C/C++易走进的误区
- cpp -- W1 从C走进C++
- C#《走进Linq》系列文章导读
- 走过C/S,走进B/S
- 走进,C#,消化第一章--->C#概述
- 【C#——走进你的世界】
- 走进java_内存分配
- C++程序设计 - Week 1 从C走进C++
- 数组 指针 内存 布局 大小端 汇编 c语言
- 用C语言表达汇编指令
- 汇编学习-汇编指令与C语言
- 走进AngularJs(三)自定义指令-----(上)
- 走进AngularJs(四)自定义指令----(中)
- 走进AngularJs(五)自定义指令----(下)
- VMware Redhat网络配置
- windows同步原理与调试(PPT)
- Activiti - 新一代的开源 BPM 引擎 Activiti 背景简介、服务和功能介绍
- 将UIPickerView横放到UIActionSheet中
- 内存对齐全攻略—刀枪入库 功德圆满
- 走进内存,走进汇编指令来看C/C++指针
- 给程序替换图标,重新签名 apk 文件。
- 内存对齐全攻略--涉及位域的内存对齐原则
- 嵌入式操作系统内核原理和开发(线程状态)
- pygame.sprite.Sprite
- 内存对齐全攻略--不涉及位域的内存对齐原则
- c++反汇编代码分析--偷调函数
- c++反汇编代码分析--循环结构
- C++反汇编代码分析--函数调用