这段代码据说可以动态创建一个二维数组。但是不能理解它的头部或尾部。如果只有某人能够逐步解释这段代码的作用,那将是一个很大的帮助。帮助赞赏!
#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;
};
答案 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;的函数的矩阵。看起来很奇怪它的设置,放置或写作,但没有得到。