矩阵指针c++
Matrix Pointer C++
这段代码应该动态创建一个二维数组。但我一点也不懂。如果有人能一步一步地解释这段代码是怎么做的,那将是一个很大的帮助。感谢帮助!
#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的单元格。
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是反向的,它们似乎都做了对方应该做的事情。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错