===《C/C++笔记》===指针

8 篇文章 0 订阅

《指针和引用的区别》

1、非空区别:在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某个对象。而指针可以赋空值,即不指向任何对象。

2、合法性区别:使用引用之前不需要测试其合法性;指针需要测试其是否为空值;

3、可修改区别:指针可以被重新赋值以指向另一个不同的对象;引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

4、应用区别:若存在不指向任何对象的可能,则需要使用指针(空指针)、需要在不同的时刻指向不同的对象,需要使用指针(改变指针指向);若干总是指向一个对象并且一旦指向一个对象后不会改变指向,则应该使用引用


《迷途指针与空指针》

当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在,这时它就是一个迷途指针(也叫悬浮指针、失控指针)。通常如果在删除了一个指针之后又把它删除了一次,程序就会变得非常不稳定。若只是删除了一个空指针,则不会发生意外情况。使用迷途指针和空指针都有可能造成程序的崩溃,但迷途指针更难预料,也难以调试。


《指针与句柄》

句柄和指针是两个截然不动的概念。windows系统用句柄标记系统资源,隐藏系统信息,是个32位的uint。指针则标记某个物理内存地址。

句柄实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要访问再重新提交到的物理内存。所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想访问对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。

句柄是一种指向指针的指针我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各个对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象了。但是,如果真这么认为,那么就大错特错了。我们知道windows是一个虚拟内存为基础的操作系统。在这种情况下,windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要,对象被移动意味着它的地址变化了。如果地址总是如此的变化,我们应该去那里找对象呢?为了解决这个问题,windows操作系统为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中哪个位置了。这个地址是在对象装载(load)时由系统分配的,当系统卸载时又释放给系统。句并地址(稳定)----->记载着对象在内存中的地址-------->对象在内存中的地址(不稳定)----->实际对象。但是必须注意,程序每次重新启动,系统不保证分配跟这个程序的句柄还是原来哪个句柄,而绝大多数情况下的确不一样。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院给我们的门票总是不同的座位是一个道理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值