C++自学笔记29(多维数组)

我们在之前的笔记中知道数组解决了重复变量的赋值问题,也知道数组就是指针可以用指针的方式修改内容。

现在有一个数组对50个变量赋值a[50],我们有50个这样的数组a[50][50],对于这样的数组我们还有50个a[50][50][50]。这就是一维数组、二维数组、三维数组......

我们拿堆上建立二维数组举例子。(堆上建立返回了指针类型方便观看,不知道栈与堆建立的区别以及书写方式移步到笔记25与笔记18

#include<iostream>

int main()
{
    int* Array = new int[50];
    int** 2dArray = new int*[50];
    std::cin.get();
}

 我们看到一维数组是包含了50个int数据类型的指针,也就是分配了50*4字节的内存大小存放整数。

二维数组是包含了50个int*型指针的指针,也就是分配了50*4字节的内存大小存放地址。这样我们就有了50个数组的数组。到此我们仅仅是声明了一个数组的数组,我们来遍历创建它。

#include<iostream>

int main()
{
    //int* Array = new int[50];
    int** 2dArray = new int*[50];
    for(int i=0;i<50;i++)
        2dArray[i] = new int[50];
    std::cin.get();
}

还记得new int[50]返回的是指针,将其循环赋值给 2dArray[i]就完成了二维数组的创建。对内部数组进行赋值实际上是对 2dArray[][]的数据赋值、 2dArray[]表示对指针的赋值也就是50个包含数据的数组我选哪一个。

#include<iostream>

int main()
{
    //int* Array = new int[50];
    int** 2dArray = new int*[50];
    for(int i=0;i<50;i++)
        2dArray[i] = new int[50];

    2dArray[0][0] = 0;
    2dArray[0][1] = 1;
    2dArray[0][2] = 5;
    2dArray[0][3] = 8;

    std::cin.get();
}

以上是对第0个数组的0123位分别赋值0158。代码已经完成了吗?并没有,还记得我们在堆上建立需要自己销毁数组delete。二维怎么操作呢?以下代码是对的吗?

#include<iostream>

int main()
{
    //int* Array = new int[50];
    int** 2dArray = new int*[50];
    for(int i=0;i<50;i++)
        2dArray[i] = new int[50];

    2dArray[0][0] = 0;
    2dArray[0][1] = 1;
    2dArray[0][2] = 5;
    2dArray[0][3] = 8;

    delete[] 2dArray ;
    std::cin.get();
}

我们知道3dArray 数组有三层从左到右是“”数组的指针的指针”“数组的指针”“数组”

那么2dArray 数组有两层从左到右是“数组的指针”“数组”

delete[]时候,销毁的是2dArray最左侧的数组,也就是存放指针的数组。这会是什么效果呢?删除了数组的指针以后,我们就找不到那50个包含数据的数组了,他就永远永远永永远远留在那了,会造成内存泄露等等问题。

#include<iostream>

int main()
{
    //int* Array = new int[50];
    int** 2dArray = new int*[50];
    for(int i=0;i<50;i++)
        2dArray[i] = new int[50];

    2dArray[0][0] = 0;
    2dArray[0][1] = 1;
    2dArray[0][2] = 5;
    2dArray[0][3] = 8;

    for(int i=0;i<50;i++)
        delete[] 2dArray[i];

    delete[] 2dArray ;
    std::cin.get();
}

先循环对2dArray[i]删除50个带数据的数组,然后再删除2dArray这个装载了50个指针的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值