存储在堆中的矩阵与存储在堆栈中的矩阵:可以看作指针数组吗?

时间:2017-12-02 15:54:31

标签: c++ arrays matrix stack heap

我想知道堆栈中存储的“作为多维数组”的矩阵与堆中存储的“作为指针数组”的矩阵之间的主要区别。

特别是堆栈中的矩阵作为“多维数组”仍然可以看作并用作指针数组吗?

我很难理解为什么我不能做以下事情:假设我想将矩阵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}}应该像指向第二行的指针。

还有一种更正确的方法来移动或复制矩阵的行(同样不使用列上的循环)?

1 个答案:

答案 0 :(得分:0)

C的一个怪癖是多维数组难以使用。大多数初学者&#39;在读者准备好了解一些微妙的困难之前,书籍会在一维数组的同一章中介绍它们。

其中一个微妙的困难是语法

MTX [i] [j]

可以引用2D数组,也可以引用双指针。如果它引用双指针,则mtx是类型**,并且包含指向1D数组的指针列表,这些数组是矩阵的行。请注意,矩阵可能是粗糙的,这是C中真正的2D数组所不允许的。

要回答你的问题,实际上如果mtx是一个类型**,我们将在堆上构造它。您可以在堆栈上构建它,但只能通过围绕类型系统进行编码。一个真正的矩阵可以在堆上或堆栈上,但是在堆上创建一个矩阵的语法是C中二维矩阵的细微困难的另一个。