C++指针的指针个人浅析

Posted Albert Wang知识库

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++指针的指针个人浅析相关的知识,希望对你有一定的参考价值。


上代码

template<class T>
class NRMat
{
private:
         intnn;
         intmm;
         T**v;
public:
         NRMat()
         NRMat(intn, int m);
         NRMat(constT &a,int n, int m);
         …
         ~NRMat();
}
 
template<class T>
NRMat<T>::NRMat():nn(0),mm(0),v(0){}  //初始化列表
 
template<class T>
NRMat<T>::NRMat(int n, int m): nn(n),mm(m),v(newT*[n])
{
v[0]=new T [n*m];
for (int i=1;i<n;i++)
v[i]=v[i-1]+m;
}
 
 
template<class T>
NRMat<T>::NRMat(const T &a,int n,int m): nn(n),mm(m),v(new T*[n])
{
v[0]=new T [n*m];
for (int i=1;i<n;i++)
v[i]=v[i-1]+m;
for (i=0;i<n;i++)
         for (int j=0;j<m;i++)
                   v[i][j]=a;
}
 
template <class T>
NRMat<T>::~NRMat()
{
if (v!=0)
{
delete[] (v[0]);
delete[] (v);
}
}

    这段程序主要完成了C++中对于二维模版数组的定义,程序虽短,但涉及的知识点却是非常重要,细品,获益匪浅。

1.函数模板、类的定义。

  这一点很容易掌握,相对于普通的类定义,需在定义前加template <class #>,函数名前、类名后加< #>#为数据类型。此处可联想到vector的使用,如vector<int>vec;由调用方式可推断vector是基于函数模版定义的类。则模板类实例化方式为NRMat<int> a,b,c

可用typedef简化代码,如

typedef constNRMat<int> Mat_DPMat_O_DP

Mat_DP a;

2. 函数重载,在此不表;
3. 构造函数的初始化列表使用,在此不作赘述;
4. 指针的使用是重点,在这里进行详细分析。

1T** v?v是指向指针的指针,如何理解?

 

2:指针占用空间固定,为何要区分指针的类型?

答:指针类型告诉系统我找到的数据用什么格式来解码。计算机中存储数据占用的空间不同,32位系统中,int占用4字节,32位;double占用8字节,64位。如果在取数据到数据总线时误把int数据当做double来取,那么后32位都是错误数据,转换为double时必然错误,同理把double数据当做int读取也会丢失32位数据,因此指针的作用可概括为到哪里去找数据,怎么解释数据。在做指针加法时,指针偏移数值由类型决定。

 

 

3NRMat<T>::NRMat(const T &a,int n, int m): nn(n),mm(m),v(newT*[n])v(new T*[n])怎么解析?

 

4v[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]

 

5v[i]=v[i-1]+m为何有这种关系?

 

6v[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 机制

C++ 浅析智能指针

浅析 C++智能指针和 enable_shared_from_this 机制

一维数组和一级指针浅析

C++虚函数浅析

二维数组和二级指针关系浅析