C++ 矩阵(RAM 中的元素不连续)

Ric*_*oel 0 c++ memory ram pointers matrix

(这需要一些背景信息,请阅读本文,然后,如果您能向我解释为什么会发生这种情况,我将不胜感激您的帮助)

之前的一些背景...

好吧,在我的大学里,他们教了我们两种用 C++ 制作矩阵的方法。

第一种方式最经典

int matrix[rows][columns];
Run Code Online (Sandbox Code Playgroud)

然后,是这样的:

int** matrix = new int*[rows];
for(int i = 0; i < rows; i++)
    matrix[i] = new int[columns];
Run Code Online (Sandbox Code Playgroud)

理论上,这是这样工作的。

矩阵图像

首先,我们创建一个向量,然后使用 for 迭代向量中的每个空间以创建行,在图像中,首先我们创建绿色列,对于列中的每个数字,我们创建其余的矩阵中的元素。

我们学习了如何使用指针来访问矩阵中的位置等。一切都工作正常,但是,在一次练习中,我需要对矩阵进行排序,而且,我的第一个想法是“如果矩阵就像 ram 中的一个大向量,我应该像向量一样对它进行排序,但在矩阵的第一个元素中使用一个指针”,(我在c中像这样对矩阵进行排序)。但是当我尝试使用气泡算法进行排序时,矩阵中带入了一些 RAM垃圾,所以......几个小时后,我尝试查看 RAM 和矩阵中的元素是如何分配的,并使用 clion i 中的调试器看到这个...

在此输入图像描述

在这种情况下,矩阵的每一行都位于连续的 RAM 空间中,但是,当到达新行时,RAM 无缘无故地跳转到 13 个位置。我不是这个主题的专家,所以,我以典型的方式创建了一个矩阵,看看这个矩阵是否具有连续的 RAM 位置和。

在此输入图像描述

正如我所料,矩阵中的元素在 RAM 中是连续的

问题

为什么会出现这种情况?我不是编程初学者,所以,我知道向量和矩阵是如何工作的。但是,我是低级内存管理器编程语言的初学者(我通常使用 php、java、python、js 等,但在大学之前从未使用过 c/c++)。

而且,C++ 如何知道如何在矩阵中进行迭代?因为如果我们用 [i][j] 迭代矩阵就可以完美地工作,如果矩阵中的元素不连续,C++ 如何知道我们是否完成了迭代一行,在 RAM 中跳转 13 个空格到下一行?

我很感谢每一个答案,非常感谢

Joh*_*136 5

int matrix[rows][columns];就像你说的那样是连续的。

int** matrix = new int*[rows];更像是

在此输入图像描述

每次调用时new都不能保证内存在哪里。从内存角度来看,第二行可能位于第一行之前。只要通过指针访问列即可,您并不关心。