对于二维动态数组,我们可以使用指针的指针来实现。在C++中,我们可以通过动态分配内存来创建二维数组。
下面是一个示例代码,演示了如何动态创建和使用二维数组:
#include <iostream>
int main() {
int rows = 3;
int cols = 4;
// 动态分配二维数组
int** dynamicArray = new int*[rows];
for (int i = 0; i < rows; ++i) {
dynamicArray[i] = new int[cols];
}
// 初始化二维数组
int count = 1;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
dynamicArray[i][j] = count++;
}
}
// 输出二维数组
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
std::cout << dynamicArray[i][j] << " ";
}
std::cout << std::endl;
}
// 释放二维数组内存
for (int i = 0; i < rows; ++i) {
delete[] dynamicArray[i];
}
delete[] dynamicArray;
return 0;
}
首先我们定义了行数rows
和列数cols
,然后使用指针的指针int** dynamicArray
来动态分配二维数组的内存。我们首先分配rows
个指针,然后为每个指针分配cols
个整型空间,这样就创建了一个rows x cols
的二维数组。
接着,我们使用两层循环初始化二维数组,将1到12依次赋值给数组的元素。
然后,我们再次使用两层循环遍历二维数组,并将每个元素的值输出到控制台,以展示二维数组中存储的值。
最后,我们需要释放二维数组的内存。首先释放每行的内存,然后释放指针数组的内存。这样可以确保释放二维数组占用的所有内存空间,避免内存泄漏。
需要注意的是,在释放二维数组内存时,需要逐行释放内存,然后再释放指针数组的内存。释放内存的顺序很重要,否则可能导致内存泄漏或者程序崩溃。
当我们使用指针的指针来表示动态二维数组时,假设我们有一个3行4列的二维数组,使用指针的指针来表示。在内存中,它的布局类似于以下结构:
---------------------------------------
| 指针1 | 指针2 | 指针3 |
----------------------------------------
| | |
| | |
V V V
------------------------------------
| 行1 | 行2 | 行3 |
| 元素1 | 元素1 | 元素1 |
| 元素2 | 元素2 | 元素2 |
| 元素3 | 元素3 | 元素3 |
| 元素4 | 元素4 | 元素4 |
--------------------------------------
在这个示意图中,每个指针指向一行的起始位置,而每一行则包含对应列数的元素。指针的指针实际上是一个指向指针数组的指针,每个指针指向一个行数组,行数组中存储着实际的元素。
其实我觉得有点像python的列表中的列表?好像一个东西里面又套了一个一样的。(狗头)
book=[[1,2,3],[1,2,3]]
print(book[0][0])
当我们动态分配内存创建二维数组时,我们实际上在内存中按照一维数组的方式存储元素。但是存储行元素的数组中存储的是指向列元素的指针,而不是直接存储列元素的值,这个就不同。
所以其实,储存行元素的数组里面存的是列元素的首地址。而不同行的列元素是离散的,通过行元素储存的地址找到。