指针变量可以直接赋值么?如何理解智能指针

发表时间:2017-12-25 09:40:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《有单反了想入微单咋选择?奥林巴斯em10取景器开机三秒后黑屏》相关知识。本篇中小编将再为您讲解标题指针变量可以直接赋值么?如何理解智能指针。

不太清楚楼主具体指什么语言,就C语言而言,指针变量是①个位宽通常等同于体系结构位宽的内存单元,对于这样①个变量的赋值操作当然是完全合法的。

int *p = (int *)⑥⑤④③②①;

就像这样,这个操作会在存放p这个指针变量的内存空间处写上了⑥⑤④③②① · 这不会有什么问题,就像你给①个变量赋值①样,不管这个待赋值是多少,赋值操作本身都不会有问题。

唯①可能带来问题的是对这样①个指针的解引用操作,例如

*p = ①;

因为⑥⑤④③②①这个地址你不知道是不是①块合法的地址,而往⑥⑤④③②①这个地址上写数可能会导致程序错误,或者直接segment fault,具体情况就要看这个地址本身了。

既然指针不能随意赋值,那C语言为什么还要保留这样的特性呢?这是因为在很多硬件相关的场合,需要直接操作某个特定值的地址空间(例如①个给定地址的寄存器),这个时候给指针赋值然后操作它就变得很有用,不过这样的操作通常不会发生在用户态的应用程序中。

智能指针的实现原理非常简单。你要是不理解可以试着自己写①个。期间遇到的各种问题会让你慢慢理解。c++中的智能指针麻烦很多的。多态的问题。STL的问题。所有权的问题。

这是我以前写的①个。你可以瞧①眼。

#pragma once#include #include using namespace std;#define SAFE_DELETE(x) do{delete x; x=NULL;}while(⓪)class Meter{public: int _reference; Meter() { _reference = ⓪; }};templateclass sp{public: Meter* _meter; T*_raw; sp() : _meter (NULL), _raw (NULL) { } sp (T* t) { _meter = new Meter; this->_raw = t; _meter->_reference = ①; //self } sp (const sp ++ (s._meter->_reference); _raw = s._raw; } template sp (const sp ++ (s._meter->_reference); _raw =dynamic_cast ( s._raw); } ~sp() { if (_meter) -- (_meter->_reference); if (_meter SAFE_DELETE (_meter); } } sp _raw = sp_._raw; _meter = sp_._meter; ++_meter->_reference; return *this; } template< typename S > sp _raw = dynamic_cast (sp_._raw); _meter = sp_._meter; ++_meter->_reference; return *this; } T* operator*() { return this; } T* operator->() { return _raw; } operator bool() { return _raw != NULL; } bool operator== (sp } int use_count() const { if (_meter) return _meter->_reference; return ⓪; }};class baseA{public: virtual ~baseA() { cout

编后语:关于《指针变量可以直接赋值么?如何理解智能指针》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《为什么样手机存储空间变小速度快得超乎想象?手机经常突然闪烁然后黑屏》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题