二维动态数组的理解

本文详细介绍了在C++中如何使用指针的指针动态创建二维数组,包括内存分配、初始化、输出以及内存释放过程,同时将其与Python列表的嵌套结构进行了对比。
摘要由CSDN通过智能技术生成

  对于二维动态数组,我们可以使用指针的指针来实现。在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])

当我们动态分配内存创建二维数组时,我们实际上在内存中按照一维数组的方式存储元素。但是存储行元素的数组中存储的是指向列元素的指针,而不是直接存储列元素的值,这个就不同。

        所以其实,储存行元素的数组里面存的是列元素的首地址。而不同行的列元素是离散的,通过行元素储存的地址找到。

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值