矩阵指针C ++

时间:2015-09-20 04:13:23

标签: c++ arrays pointers matrix

这段代码据说可以动态创建一个二维数组。但是不能理解它的头部或尾部。如果只有某人能够逐步解释这段代码的作用,那将是一个很大的帮助。帮助赞赏!

#include<iostream.h>

class matrix{
     int **p;
     int d1, d2;

 public:
     matrix(int x, int y);
     void get_element(int i, int j, int value){ p[i][j]=value; }
     int &put_element(int i,int j) { return p[i][j]; }
};

matrix::matrix(int x, int y){      
    d1 = x;
    d2 = y;
    p = new int *[d1];
    for(int i = 0; i < d1; i++) p[i] = new int[d2];
}

int main(){
    int m, n;
    cout << "enter size of matrix:";
    cin >> m >> n;
    matrix A(m, n);

    cout << "enter matrix elements row by row\n";
    int i, j, value;

    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++){
            cin >> value;
            A.get_element(i, j, value);
        }
        cout << "\n";
        cout << "A.put_element(1, 2);

    return 0;
};

2 个答案:

答案 0 :(得分:0)

请记住创建一个2D数组,你必须在某个点有一个指向指针的指针,这就是** p。如果你想做一个3D数组,你需要在某个地方使用***。 d1和d2是数组的尺寸或大小。

matrix :: matrix(int x,int y){...部分处理创建数组。维度var di和d2已更新。

p = new int * [d1]; ...分配一个长度为d1的指针数组,所以现在p是一个指针,指向一个指针数组。这刚刚创建了数组的1D。根据行下降来考虑这一点,因为此数组中的第一个索引将是2D数组的顶行。

for循环实际上为指针数组中的每个指针创建了一个长度为d2的数组。现在可以通过p [row] [column]编辑和访问2D数据,或者这可能更容易p [y] [x]。

旁注我认为put_element和  get_element是倒退的,他们似乎都做了另一个应该做的事情。

答案 1 :(得分:0)

理解这一点的关键是构造函数:

matrix::matrix(int x,int y)
 {      
  d1=x;
  d2=y;
  p=new int *[d1];
  for(int i=0;i<d1;i++)
  p[i]=new int[d2];
 }

首先是#34;容器&#34;行,每行是一个整数数组。在动态分配时,整数数组存储为指针。因此new int *[d1]为d1条目创建一个新的整数指针数组。该数组中的每个条目都是一个指针,最初没有初始化。现在,指针数组可以通过&#34;指针存储指针&#34;,在此类中声明为int **p;这可以作为指向指针数组的指针读取因为那是在这种情况下的意图。 &#34;双指针&#34; idiom有其他用途,有时候(坏的,真的,来自C风格的语言用法),但在这种情况下,它存储一个指向整数的指针数组。

现在,对于每一行,p[i]=new int[d2]创建一个整数数组。数组通过指向整数的指针存储,标识为p[i]

因此,行p[0]的类型为int *。如果我宣布:

int * row = p[1]; 

然后,row将是矩阵第1行的整数数组。

这意味着p[1][1]获取矩阵的单元格1,1或第1行的第1列。在您的示例中,函数get_element和put_element似乎在名称中相反。 get_element函数实际上在矩阵中放置一个值。在get_element中找到的语句p[i][j]=value是,而不是获取值,将值写入i,j处的单元格。

奇怪的是,函数put_element实际上可以用于两个目的,因为它返回对单元格i,j处的整数的引用。它的名字取决于它的目的。让我们说,为清楚起见,我们称之为:

int & at(int i, int j )
{
 return p[i][j];
}

现在,这两种方式都有效(这可能是错误的设计选择,但是......)

int x = m.at( i, j ); // getting a value;
m.at( i, j ) = 4;     // writing a value;

这是因为它正在返回一个引用。您甚至可以使用它:

int & rv = m.at( i, j );

现在,无论你怎么做,你都会在i,j做单元。

这可能是一个错误。名称应该颠倒,但GET函数通常不应该返回引用,除非它是const&amp ;.你通常不想要&#34; getters&#34;允许进行更改。

示例程序有点危险。输入没有检查是否合理,因此可以轻松尝试分配GB的RAM。除此之外,显而易见的是,接收值并将它们应用于具有名为&#34; get_element&#34;的函数的矩阵。看起来很奇怪它的设置,放置或写作,但没有得到。