如何建立一个动态二维数组? 用NEW

banksqian 2002-08-27 10:18:35
建一维数组我会.
int n;
cin >> n;
int *p = new int[n];

如何建一个二维的? P[M][N]?

谢谢
...全文
317 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
geeksky 2002-08-30
  • 打赏
  • 举报
回复
数组名可以当作指针用,但指针应该是不能当作数组名用吧

我是菜鸟,说错了不要骂
===================================================================
落花有意随流水,流水无心恋落花
===================================================================

evilsong 2002-08-30
  • 打赏
  • 举报
回复
请看我昨天的贴子:"一个多维数组类",很详细的
ylbug 2002-08-30
  • 打赏
  • 举报
回复
这就不是我最先所说的只有最左边那一维的大小是可变的吗?!
stidio_zhougang 2002-08-29
  • 打赏
  • 举报
回复
今天我又搞出了一种办法:
int (*p)[4]=new int[3][4];
简单吧,我验证了,绝对符合数组要求,并且不多申请空间!
哈哈,So Easy!
banksqian 2002-08-28
  • 打赏
  • 举报
回复
谢谢大家.
radioheads 第一行应为 int **x = new int *[n];
第三行应为 int *y = new int[m]; // row 和 column 不同

两位的答案都对,意思一样的,都通过验算,谢谢......
ylbug 2002-08-28
  • 打赏
  • 举报
回复
这不失为一个办法,损失一点效率而与,如果追求效率的话,还是用一维数组代替吧!
ml_jack 2002-08-28
  • 打赏
  • 举报
回复
地址不连续没问题, 使用时是透明的,
每一行用一个new

最好用类封装起来,再从在一下运算符,就更好用了
ylbug 2002-08-28
  • 打赏
  • 举报
回复
一句话:必须分配连续的地址空间,才能用二位数租的引用方式,老猫的那种方式是不对的,能通过演算可能因为每次分配的空间比较小,地址恰好连续。你可以在VC环境下编译你的代码,运行的时候很可能出现异常:Access Vilation
stidio_zhougang 2002-08-28
  • 打赏
  • 举报
回复
如果认为这是对的,我想首先你应该先仔细理解一下二维数组的概念,更确切的说应该是理解一下二维数组空间存储的概念:二位数组要求数组名指向一片连续的内存(借用ylbug(臭虫)兄的一句话)

请看这个程序:
#include <iostream>
using namespace std;
int main()
{
int i;
int **p=new int*[3];
for(i=0;i<3;i++)
p[i]=new int[4];
for(i=0;i<3;i++)
cout<<p[i]<<'\t';
}
按照上面的理论可以知道由于每个int占用4个字节(32位机),则
假如p[0]=0x00341F18,则p[1]=0x00341F28 ,p[3]=0x00341F38
但是实际上为:00341F18 00341F30 00341F48
于是这不是标准二维数组所能满足的:
如果要实现可以采用这种方式:
#include <iostream>
using namespace std;
int main()
{
int i;
int *iForAll=new int[3*4]
int **p=new int*[3];
for(i=0;i<3;i++)
p[i]=new(iForAll+i*4) int[4];
//如果这句不能理解这样用也可以:p[i]=iForAll+i*4
for(i=0;i<3;i++)
cout<<p[i]<<'\t';
}
现在运行试试,看看是不是已经标准了?:)
forrest2001 2002-08-27
  • 打赏
  • 举报
回复
老猫没错
实践通过 有什么问题??
radioheads 2002-08-27
  • 打赏
  • 举报
回复
int **x = new *int[n];
for(int ix = 0; ix < n; ix++)
{
int *y = new int[n];
x[ix] = y;
}

对吗?
ylbug 2002-08-27
  • 打赏
  • 举报
回复
你得到p不是指向连续的m*n*sizeof(int)空间,但是二位数组要求数组名指向一片连续的内存,这样才能使用p[i][j]这种运算,因为p[i][j]相当于*(p+i*n+j)
ylbug 2002-08-27
  • 打赏
  • 举报
回复
好象这样不行把
blh 2002-08-27
  • 打赏
  • 举报
回复
例子:

#include <stdio.h>

// M: 5, N 6
int **p;

int main()
{
int i, j;
p = new int *[5];
for (i = 0; i < 5; i ++)
{
p[i] = new int[6];
for (j = 0; j < 6; j++)
p[i][j] = j;
}
for (i = 0; i < 5; i++)
{
for (j = 0; j < 6; j++)
printf("%4d", p[i][j]);
printf("\n");
}
return 0;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧