【拾遗】C++申请动态连续内存的二维数组

前几天去科大讯飞面试,其他问题回答的都还不错,但是被问到这个“如何动态申请一个连续内存空间的二维数组”时,稍微顿了一下。倒不是回答不上来,而是之前从没有尝试敲过这样的代码,光说思路实在是太干瘪。

回来以后,尝试了几段代码,又和不少人讨论了一下,把代码撸了出来。


先说思路:对于要求的x*y的二维数组,可以先申请一段连续的x*y内存空间,然后通过指向指针的指针的重新定位每行开头的位置。


刚开始和本人讨论的时候,不少人给了这样的代码:

	int **p2 = new int *[x];
	for (int i = 0; i < x; i++)
		p2[i] = new int[y];
但是,这段代码只是用来动态申请二维数组的,循环x次来申请长度为y的内存空间时,只能保证每一行的空间是连续的,并不能保证第n行的最后一个元素和第n+1行第一个元素的地址是连续的。


后来尝试了一下,给出了正确的代码:

	int **p1 = new int *[x];
	*p1 = new int[x*y];
	for (int i = 0; i < y; i++)
		p1[i] = *p1 + i*y;
一次性申请了x*y的空间,然后通过循环,重新定位每行第一个元素的所指向的地址。保证了二维数组从头到尾的连续性。


两段代码整合比对;

#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc,char *argv[])
{
	int x, y;
	cin >> x >> y;


	cout << "动态连续二维数组" << endl;
	int **p1 = new int *[x];
	*p1 = new int[x*y];
	for (int i = 0; i < y; i++)
		p1[i] = *p1 + i*y;

	for (int i = 0; i < x; i++)
		for (int j = 0; j < y; j++)
			p1[i][j] = i + j;
	
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
			cout << &p1[i][j] << "  ";
		cout << endl;
	}



	cout << "动态离散二维数组" << endl;
	int **p2 = new int *[x];
	for (int i = 0; i < x; i++)
		p2[i] = new int[y];
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
			cout << &p2[i][j] << "  ";
		cout << endl;
	}
	system("pause");
    return 0;
}
专门将两种申请二维数组方式的最后二维数组的地址给输出出来

很明显,第二种方式确实不是连续空间的二维数组。


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值