【问题标题】:Matrix Pointer C++矩阵指针 C++
【发布时间】:2015-09-20 04:13:22
【问题描述】:

这个代码应该是动态创建一个二维数组。但无法理解它的头部或尾部。如果有人可以逐步解释这段代码的作用,那将是一个很大的帮助。帮助表示赞赏!

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

【问题讨论】:

  • 理解代码的第一步是让它更“人类可读”:缩进它,在已知和未知的段上添加 cmets,等等。
  • @Ziezi 感谢您的提示!以后会实施的。

标签: c++ arrays pointers matrix


【解决方案1】:

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

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 将是来自矩阵第 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 );

现在,无论你对 rv 做什么,你也在对 i,j 处的单元格做。

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

示例程序有点危险。没有检查输入的完整性,因此这可以很容易地尝试分配 GBytes 的 ram。除此之外,很明显,使用名为“get_element”的函数接收值并将它们应用于矩阵似乎很奇怪。它是设置、放置或写入,但不是获取。

【讨论】:

    【解决方案2】:

    记住要创建一个二维数组,你必须在某个点有一个指向指针的指针,这就是**p。如果你想做一个 3D 数组,你需要 ***p 某处。 d1 和 d2 是数组的维度或大小。

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

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

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

    旁注我认为 put_element 和 get_element 是倒退的,他们似乎都在做对方应该做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多