C++中怎么用new函数定义一个二维数组?

二维数组的大小是不定的,由输进去的数传为二维数组的大小。... 二维数组的大小是不定的,由输进去的数传为二维数组的大小。 展开
 我来答
问明6E
高粉答主

2019-05-20 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:13万
展开全部

假设a,b为两个int型变量,如果希望这样生成一个二维数组:new int[a]<b>,是不会得到编译器允许的——因为没有指定这个数组的元素类型。

由于b的大小未知,编译器无法确定‘int<b>’到底是一个什么类型。所以,要用new创建一个二维数组。

方法一:使用常量

接上:如果将b指定为一个常量,例如new int[a][5],其实质与new int[a]创建一个动态数组并无多大区别——只是元素类型由int变为了'int[5]'而已。

示例代码:

void TestFunc_(unsigned int n)

{

unsigned int i,j;

//元素类型为‘int[5]’的数组,可赋值给‘int[5]’类型的指针.

int(*array2D)[5]=new int[n][5];

for(i=0;i<n;++i)

{

for(j=0;j<5;++j)

{

array2D<i>[j]=i*5+j;

}

}

//回收方法和普通动态数组相同,使用'delete[]'即可

delete[]array2D;

}

用这个方法来创建二维数组,比较直观、易用,但它最大的限制在于:你必须在编译时确定b的大小。

方法二:使用指针间接引用

首先创建若干个大小一致的动态数组,然后将这些数组的首地址(转化为指针)按顺序存储到一个动态数组中,就相当于模拟了一个二维动态数组。

示例代码:

void TestFunc_pointer(unsigned int height,unsigned int width)

{

unsigned int i,j;

//数组的元素类型为‘int*’,可赋值给指向‘int*’的指针.

int**array2D=new int*[height];

for(i=0;i<height;++i)

{

array2D<i>=new int[width];

}

//访问.

for(i=0;i<height;++i)

{

for(j=0;j<width;++j)

{

//内存非连续,注意防止越界.

array2D<i>[j]=i*width+j;

}

}

//首先回收低一级的动态数组.

for(i=0;i<height;++i)

{

delete[]array2D<i>;

}

//然后回收高一级的动态数组.

delete[]array2D;

}

方法三:使用vector

借助STL中的vector,我们可以很直观的创建一个二维数组,而不需要用到基本数组的概念。

示例代码:

void TestFunc_vector(unsigned int height,unsigned int width)

{

typedef std::vector<int>IntVector;

typedef std::vector<IntVector>IntVector2D;

unsigned int i,j;

IntVector2D*pArray2D=new IntVector2D;

//动态设置大小.

pArray2D->resize(height);

for(i=0;i<height;++i)

{

(*pArray2D)<i>.resize(width);

}

for(i=0;i<height;++i)

{

for(j=0;j<width;++j)

{

(*pArray2D)<i>[j]=i*width+j;

}

}

delete pArray2D;

}

云淡风轻in苏州
推荐于2017-11-26 · TA获得超过599个赞
知道小有建树答主
回答量:418
采纳率:0%
帮助的人:555万
展开全部
#include<stdio.h>

void main()
{
int** p;
int m, n;
scanf("%d %d",&m,&n);
if(m <= 0 || n <=0)
{
printf("输入为负数\n");
return;
}

int i;
//先开第一维空间
p = new int*[m];
for(i = 0; i < m; ++i)
{
//再开第二维空间
p[i] = new int[n];
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
推荐于2018-02-26 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450132
专业C/C++软件开发

向TA提问 私信TA
展开全部

需要先申请一个M个元素的一维指针空间,然后对每个一维指针上,申请N个元素的对象空间。这样就可以申请一个M行N列的二维数组空间了。


以整型为例

const int M = 10, N = 5;//10行5列。
int ** a;
a = new int *[M];
for(int i = 0; i < M; i ++)
    a[i] = new int[N];

所得到的a就是10行5列的数组。

使用后需要释放,代码为

for(int i = 0; i < M; i ++)
    delete [] a[i];
delete []a;
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乌真赧清
2019-03-28 · TA获得超过3806个赞
知道大有可为答主
回答量:3082
采纳率:33%
帮助的人:201万
展开全部
需要先申请一个M个元素的一维指针空间,然后对每个一维指针上,申请N个元素的对象空间。这样就可以申请一个M行N列的二维数组空间了。
以整型为例
const int M = 10, N = 5;//10行5列。
int ** a;
a = new int *[M];
for(int i = 0; i < M; i ++)
a[i] = new int[N];
所得到的a就是10行5列的数组。
使用后需要释放,代码为
for(int i = 0; i < M; i ++)
delete [] a[i];
delete []a;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式