我们在之前的笔记中知道数组解决了重复变量的赋值问题,也知道数组就是指针可以用指针的方式修改内容。
现在有一个数组对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个指针的数组。
标签:int,29,C++,50,2dArray,数组,多维,new,指针 From: https://blog.csdn.net/weixin_64418869/article/details/140747049