我想知道堆栈中存储的“作为多维数组”的矩阵与堆中存储的“作为指针数组”的矩阵之间的主要区别。
特别是堆栈中的矩阵作为“多维数组”仍然可以看作并用作指针数组吗?
我很难理解为什么我不能做以下事情:假设我想将矩阵B的一行设置为等于同一矩阵的另一行,但我不想使用循环列索引,即我不想将矩阵的单个元素设置为彼此相等,而是直接移动行。
以下是我尝试的三种方式
#include <iostream>
using namespace std;
int main() {
int xsize=3, ysize=3;
int row1, row2;
int B[][3]={{1,2,3},{4,5,6},{7,8,9}};
cout << "Row to change?";
cin >> row1 ;
cout << "Which row must it be set equal to?";
cin >> row2 ;
//1): set the two rows equal directly:
B[row1 - 1] = B[row2 - 1];
//gives error : "invalid array assignment"
//------------------------------------------------------------------------
//2) create copy on the heap and set the row of B equal to the row of matrix
int ** matrix = new int*[ysize];
for(int i = 0; i < ysize; i++) {
matrix[i] = new int[xsize];
}
for(int i = 0; i < ysize; i++) {
for(int j = 0; j < xsize; j++) {
matrix[i][j]=B[i][j];
}
B[row1 - 1] = matrix[row2 - 1];
//gives the error "incompatible types in assignment of 'int*' to 'int [3]"
//------------------------------------------------------------------------
//3) the same as 2) but reversed
matrix[row1 - 1] = B[row2 - 1];
//this one works, so that I can print the matrix modified
for(int i = 0; i < ysize; i++) {
for(int j = 0; j < xsize; j++) {
cout << matrix[i][j] << " ";
}
cout << "\n";
}
}
我无法理解为什么1)和2)不工作,而3)确实如此。如果我颠倒2)中的相等性(我在3中做过)并且为什么它只是以这种方式起作用,那么差异是多少呢?
我认为矩阵无论如何都可以看作是一个指针数组,因为如果我打印像cout << B[1];
这样的东西给我第二行的第一个元素的内存索引,这是一个数组,所以{{ 1}}应该像指向第二行的指针。
还有一种更正确的方法来移动或复制矩阵的行(同样不使用列上的循环)?
答案 0 :(得分:0)
C的一个怪癖是多维数组难以使用。大多数初学者&#39;在读者准备好了解一些微妙的困难之前,书籍会在一维数组的同一章中介绍它们。
其中一个微妙的困难是语法
MTX [i] [j]
可以引用2D数组,也可以引用双指针。如果它引用双指针,则mtx是类型**,并且包含指向1D数组的指针列表,这些数组是矩阵的行。请注意,矩阵可能是粗糙的,这是C中真正的2D数组所不允许的。
要回答你的问题,实际上如果mtx是一个类型**,我们将在堆上构造它。您可以在堆栈上构建它,但只能通过围绕类型系统进行编码。一个真正的矩阵可以在堆上或堆栈上,但是在堆上创建一个矩阵的语法是C中二维矩阵的细微困难的另一个。