矩阵指针c++

Matrix Pointer C++

本文关键字:c++ 指针      更新时间:2023-10-16

这段代码应该动态创建一个二维数组。但我一点也不懂。如果有人能一步一步地解释这段代码是怎么做的,那将是一个很大的帮助。感谢帮助!

#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 rown";
    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;
};

理解它的关键是构造函数:

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];
 }

首先形成的是行"容器",其中每一行都是整数数组。动态分配时,整型数组作为指针存储。因此,new int *[d1]为d1项创建了一个指向整数的指针数组。该数组中的每个条目都是一个指针,一开始没有初始化。现在,指针数组可以通过"指向指针的指针"来存储,在这个类中被声明为int **p;。这可以被读取为指向指针数组基的指针,因为这是在这种情况下的目的。"双指针"习惯用法有时还有其他用途(实际上,来自C风格语言的不良用途),但在这种情况下,它用于存储指向整数的指针数组。

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

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

int * row = p[1]; 

则row将是矩阵第一行的整数数组。

这意味着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的整数的引用。它的名字掩盖了它的目的。为了清楚起见,我们称它为at,如:
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 );

现在,不管你对rv做了什么你同时也对第i,j单元格做了什么

这可能是一个错误。名称应该颠倒,但是GET函数通常不应该返回引用,除非它是const &。你通常不希望"getter "允许进行更改。

示例程序有点危险。没有检查输入是否正常,因此很容易尝试分配gb的ram。除此之外,很明显,使用名为"get_element"的函数接收值并将其应用于矩阵似乎很奇怪。它是设置、放置或书写,而不是获取。

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

矩阵::matrix(int x,int y){…部分处理创建数组。更新维度变量di和d2。

The p=new int *[d1];…分配一个长度为d1的指针数组,所以现在p是一个指针,指向一个指针数组。这就创建了数组的一维。从行向下的角度来考虑这个问题,因为这个数组的第一个索引将是2D数组的顶部行。

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

旁注:我认为put_element和Get_element是反向的,它们似乎都做了对方应该做的事情。