博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++ 内存机理的个人理解(一)——地址和指针的关系
阅读量:6677 次
发布时间:2019-06-25

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

    内存的概念就不赘述了,在此主要叙述一下VC++中指针,地址,堆,栈的个人理解,如果有错请不吝指出。

    地址是什么?

    地址是一个变量在内存中的“门牌号码”,要得知一个变量的值,只要根据变量的地址就能得到这个地址中到底住的是什么人(这个变量的值到底是什么)。

    对于值类型的变量来说,一个地址就能对应一个变量了。但是对于大小超过一个内存块的引用类型,当这个引用类型在一个地址对应的内存块中放不下,这个引用类型的地址就是它的多个内存块的首地址,程序可以通过这个首地址得到一整块内存,也就得到了这个对象。

    其中涉及了对象的内存分配原则,关于这个请参见其它内容。在本文中,主要记住,地址就是变量的首地址。

    比如我们如下代码:

int a=0; int b=0; cout<<"Address Of a Is:"<<&a<<endl; cout<<"Address Of b Is:"<<&b<<endl;

    它们的值都是0,但是它们的地址&a和&b是不一样的,输出结果如下:

Address Of a Is:0012FE58

Address Of b Is:0012FE4C

 

    指针是什么?

    指针也是一种变量,我们可以理解为指针就是专门记录地址的值类型。因为我们可以通过首地址得到变量,所以一个变量不管多大,需要多少内存,只需要一个指针就能指向它了。

    因为指针也是变量,所以指针是有自己的地址的(没有地址,指针记录的目标的地址存在哪儿呢?对吧),比如我们接着看如下的代码

int *p1=&a; int *p2=0; int *p3=0; cout<<"Address Of p1 Is:"<<&p1<<endl; cout<<"Address Stores In p1 Is:"<<p1<<endl; cout<<"Address Of p2 Is:"<<&p2<<endl; cout<<"Address Of p3 Is:"<<&p3<<endl;

    我们为指针p1赋值是变量a的地址,所以p1的值就是&a。

    我们为p2赋的值是在栈内存中开辟的一个新的数字0的地址。为什么不用&0?这是编译器的要求,虽然理解上容易了很多,但是每次这样写岂不是很累人?在大家都知道的情况下,我们就不要用这么麻烦的写法了。

    为什么还要给p3也赋上0的地址?这是为了证明这个0不是只有一个,虽然看起来都是0,但是p2指向的0不是p3指向的0。看结果,大家就明白了。

Address Of p1 Is:0012FE40

Address Stores In p1 Is:0012FE58
Address Of p2 Is:0012FE34
Address Of p3 Is:0012FE28

    这个结果说明指针是有自己的地址的,同时,指针记录的值就是它所指向的变量的地址,比较一下一开始的代码中变量a的地址“&a”和现在p1的值,都是:0012FE58,说明我们只要通过p1就能找到a,就能找到a变量内存块中的值了。

    再深究一下指针如何?

    因为指针也是一个变量,所以,我们当然可以做一些很匪夷所思的事情,比如:用一个指针指向一个指针!请看下面的代码。

int **pp=&p1; cout<<"Address Of pp Is:"<<&pp<<endl; cout<<"Address Of p1 Is:"<<pp<<endl; cout<<"Address Stores In p1 Is:"<<*pp<<endl;

    小凡一开始学C++看到这个代码的时候差点就要骂街了,这是什么东西啊。其实就是一个指针的指针,pp就是Pointer to Pointer的缩写,呵呵。在pp中记录的是p1的地址,同时pp也有自己的内存地址。看看结果是不是像我们想的一样?

Address Of pp Is:0012FE1C

Address Of p1 Is:0012FE40
Address Stores In p1 Is:0012FE58

    pp的内存地址是全新的,这是废话,因为pp是一个新的变量,当然需要一个新的内存块来存储它的值。同时pp的值就是p1的地址,上面我们已经用&p1来输出验证了。同时,我们用*pp来获得了p1中的值。

    *符号就是解引用符,说白了,就是找到[内存地址=变量中的值]的那个内存块中的值。所以我们的*pp就是:根据pp中存储的p1的地址找到了p1,并且输出了p1内存块中的值,也就是变量a的地址&a。

    有点绕人不是吗?其实只要记住简单的一点:地址是自动分配的,不能人为改变;指针是记录地址用的,我们可以用过解引用符*通过指针记录的地址来获取这个首地址记录的变量。就这么简单。

转载于:https://www.cnblogs.com/vanpan/archive/2009/02/07/3583047.html

你可能感兴趣的文章
JavaScript中的变量提升(Hoisting)
查看>>
详解 | TiDB 2.0 GA is here!
查看>>
GridManager 导出
查看>>
360前端星学习笔记-HTML
查看>>
vue踩坑
查看>>
Linux常用命令
查看>>
JavaScript函数式编程之错误处理,强壮代码
查看>>
django ModelForm中添加非必填项(not require)字段方法
查看>>
正则表达式之小有名气
查看>>
《PHP 设计模式》翻译完毕
查看>>
关于前端RSA加密和解密的研究
查看>>
前端技术栈补全计划---websocket
查看>>
【数据结构Java语言描述】数组表示顺序表
查看>>
【JS图形学基础】二维图形学的变换
查看>>
mysql分割字符串
查看>>
express如何使用session与cookie
查看>>
react技术栈
查看>>
面向对象的JavaScript(如何一步步成为js高手)
查看>>
Java+MySQL实现附近功能
查看>>
一篇文章带你理解闭包
查看>>