C++指针的指针个人浅析
Posted Albert Wang知识库
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++指针的指针个人浅析相关的知识,希望对你有一定的参考价值。
上代码
|
这段程序主要完成了C++中对于二维模版数组的定义,程序虽短,但涉及的知识点却是非常重要,细品,获益匪浅。
1.函数模板、类的定义。
这一点很容易掌握,相对于普通的类定义,需在定义前加template <class #>,函数名前、类名后加< #>,#为数据类型。此处可联想到vector的使用,如vector<int>vec;由调用方式可推断vector是基于函数模版定义的类。则模板类实例化方式为NRMat<int> a,b,c;
可用typedef简化代码,如
typedef constNRMat<int> Mat_DP,Mat_O_DP;
Mat_DP a;
问1:T** v?v是指向指针的指针,如何理解?
问2:指针占用空间固定,为何要区分指针的类型? 答:指针类型告诉系统我找到的数据用什么格式来解码。计算机中存储数据占用的空间不同,32位系统中,int占用4字节,32位;double占用8字节,64位。如果在取数据到数据总线时误把int数据当做double来取,那么后32位都是错误数据,转换为double时必然错误,同理把double数据当做int读取也会丢失32位数据,因此指针的作用可概括为到哪里去找数据,怎么解释数据。在做指针加法时,指针偏移数值由类型决定。
问3:NRMat<T>::NRMat(const T &a,int n, int m): nn(n),mm(m),v(newT*[n])中v(new T*[n])怎么解析?
问4:v[0]=new T [n*m]怎么解析?同v(newT*[n])比较? 答:v[0]等效为*(v+0),指针的加法不同于一般数据的加法,指针加法根据存储的数值及所指向数据的类型进行位移,如在32位系统中int*加1指针偏移4字节,v存储的编号+4。由于v是指向T*的指针,v数值增量=(T*所占字节数)*偏移数N而不是N。*(v+0)即v[0]类型是T*,指向存储数据类型T区域的指针,所以赋值为new T [n*m]。
问5:v[i]=v[i-1]+m为何有这种关系?
问6:v[i][j]=a如何理解? 答:v[i][j]等效为*(*(v+i)+j)。第一次解码取出T*,第二次取出T。 |
5.构造函数中存在new空间的析构函数建立。本例中用delete[] (v[0]) ; delete[] (v),格式为delete[] (ptr),由于构造函数中产生两次空间定义,第一次赋值给v,第二次赋值给v[0],所以需释放两次。记住顺序不可颠倒,若先释放v,则v[0]便不复存在。
6.赠送知识点,命名空间,可定义名字为空的空间,仅可在本文件中可使用。
namespace NR
{
inline voidname(){};
}
NR::name();
namespace { inline void shift(){……}; }
void main(){ shift(); return; } |
以上是关于C++指针的指针个人浅析的主要内容,如果未能解决你的问题,请参考以下文章
浅析C++智能指针和enable_shared_from_this 机制