C++如何动态分配二维数组?

二维数组的结构

假如现在我们有一个二维数组:

int arr[3][4] = {};

它的排列应该是什么样的呢?
在这里插入图片描述
这里画的行和列其实并不是关键,因为不同的编译器的结果可能不一样,大多数编译器为行主序,也有编译器是列主序的
二维数组其实就是数组的数组,它的第一维的元素是指针,每个元素指向系统中所分配的内存,也就是第二维的首地址,第二维即是真正存储数据的地方
这么听起来有点抽象,可以先继续往下看,看完代码细节再回来理解。

动态分配内存创建二维数组(代码)

	int row;//行
	int col;//列
	cin >> row >> col;

	//先分配数组的第一维(行)
	int* (*arr) = new int* [row];

	//分配数组的第二维(列)
	for (int i = 0; i < row; i++) {
		arr[i] = new int[col];
	}

细节讲解

1. 行的创建

int* (*arr) = new int* [row];

这行代码声明了一个行指针(二级指针)arr,并给他的第一维分配内存。这行代码其实可以写成两行:

int** arr;
arr = new int* [row];

第一行是声明一个二级指针,第二行则是将动态分配的一个int*类型的数组传给arr,此时,arr的结构是:
在这里插入图片描述

2. 列的创建

for(int i=0;i<row;i++){
	arr[i] = new int[col];
}

我认为这一步的结构是很好理解的,就是利用for循环不断地遍历,一行行地创建数组的第二维,使行的第一个元素指向动态分配的数组的首元素。再用一张图来解释下这个for循环所做的操作吧:
在这里插入图片描述

就是说使用arr[0]去接收我新分配的内存的首地址,跟我们平时new一个数组是一样的,只是在这里,我用的是指针类型的数组元素去接收它。
可能有人会有疑惑:arr[i]不应该是个整型吗?为什么可以接收new出来的指针?其实这是一开始的判断就错了,arr[i]不是整型而是指针。还记得一开始对arr的声明吗?

int*(*arr);

不难看出,*arr是一个整体,直接理解为将arr进行一次解引用操作也是没问题的。
有的地方可能不会这么写,而会写成:

int** arr;

其实这两种是一样的,只是前者能更好的理解二维数组的结构。

释放内存

先直接给出代码:

	//先delete每一行分配的内存
	for (int i = 0; i < row; i++) {
		delete[] arr[i];
	}

	delete[] arr;

这个结构跟创建的时候其实是一样的,只是在释放的顺序与分配的相反,只要理解了分配的原理这里是很好理解的。

如果我说的哪里有问题或者说的不够清楚麻烦评论区或者留言告诉我,我将立马对文章内容进行修改,谢谢各位大佬

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

默示MoS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值