如何理解这个二维动态数组实现?这是最基本的实现吗?

Posted

技术标签:

【中文标题】如何理解这个二维动态数组实现?这是最基本的实现吗?【英文标题】:How to understand this 2D dynamic array implementation? Is this the most basic implementation? 【发布时间】:2016-10-11 03:34:33 【问题描述】:

我是 C++ 新手,无法理解这段代码。我把我目前的理解放在了 cmets 中。这是思考这个问题的正确方式吗?如果没有,正在做什么? (简单来说)

int** arrayA;  //a pointer to a pointer
arrayA = new int* [2]; //Does this 2 mean that there will be 2 rows?

arrayA[0] = new int[3]; //for the first row, three columns
arrayA[1] = new int[3]; //for the second row, three columns

/*Are the two lines above this CREATING or just ACCESSING the array? */

如果我的数组有 3 行,我是否必须添加 arrayA[2] = new int[3];

我知道我也必须删除它,因为它是动态分配的,否则堆中会出现内存泄漏错误。正确的?

【问题讨论】:

表示2行3列。他们将被访问为arrayA[row_number][column_number] //2 pointers:错了。只有一个指针。 @Jaden,表示指向指针的指针。 您所拥有的称为锯齿状数组,具有手动内存管理功能。而是使用a single std:.vector as storage 作为数组。 @Jaden,你的理解是准确的。回答中没有什么可说的了。 【参考方案1】:

这不是传统的二维数组。这是一个指向数组的指针数组。不保证内存是连续的。但是,它有一个很好的特性,可以让你说:

my_pseudo_2d_array[1][3]

当它作为双指针传递给函数时 - 而作为指针传递的实际二维数组需要进行 row* width + column 数学运算才能访问元素。

【讨论】:

这不只是静态数组的基本实现吗?纠正我我错了 静态数组是一个连续的元素数组,并且尺寸最小。这具有每行一个指针的额外内存开销。一个二维整数数组的大小为宽度 * 高度 * sizeof(int)。这具有大小 width * height * sizeof(int) + height * sizeof(pointer) 此外,您的数组需要手动清理(在 for 循环中删除 [],然后是另一个 delete []),而静态数组是词法范围的。跨度> 你最后一句中提到的数学不是必需的 - 你似乎描述了将二维数组别名为一维数组的情况 @M.M 如果您将其传递给函数并且在编写函数时没有可用的确切尺寸,则它是必需的。 (MyType * array, int width, int height) 是一个很常见的习语,不是吗? 所以int randomarray[2][0] 是一个两行三列的静态数组,而anotherarray[1][3] 是一个动态分配的一行三列数组?我觉得如果我尝试这个会出错

以上是关于如何理解这个二维动态数组实现?这是最基本的实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ArrayList 创建一个动态二维整数数组

最基础的动态数据结构:链表

delphi 图像数组怎么创建和使用

动态数组的实现(c语言)----数据结构

常见的线性结构

java使用foreach语句遍历二维数组如何实现?