DragonCheng的方法线性的内存,二维的使用比如申请动态的m * n(m列n行) 的 int数组 int *pArray = new int [ m * n];然后动态的使用int I24 = *(pArray + m * 4 + 2);这样删除也很简单,以此类推,也可使用三维的动态数组int *pArray = new int [ m * n * p]; int I325 = *(pArray + m * n * 5 + n * 2 + 3);
to Lansie: 你的写法其实和我上面的帖子是一样的: long **lp=new long*[i];肯定是正确的,lp只是一个指向指针的指针(指向一个指针数组),指针数组中的每一个指针还需要象你下面写的那样初始化:for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];删除时正好相反,看我上面的帖子吧,照着写一个循环就可以了。
why not use my code? what? Don't know templete? HAHAHA.... Btw, ssizeRow is the static varable for row, and ssizeCol for colomn.
你那种方法自己用过吗!!!!
不会不要误人!
其实二维与一维本质是一样的,只是用二维比一维更方便。
long lTmp[2][3];
只是因为无法确定维数,所以要通过new产生
好象用
long **lp=new long[i][j];
连编译都通不过后来我试出来了,不知这样对否?(编译通过的)
long **lp=new long*[i];
for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];
还有,怎么删呢?
main()
{
long ** i;
i=(long **)new long[4][5]; delete *i;
delete i;
}
用DragonCheng的方法可以的,比如说,为一个高和宽分别为Height、Width的位图
开一个内存,就可用上面的代码。
char *p=new p[width*height];
.....
if(p)
delete p;
for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];
.
...
删除:
for(int nCount=0;nCount<i;nCount++) delete [] long[nCount];
delete [] long;
所谓new,只管分配一块内存,而不管这内存做什么用,也不会将内存结构化(指定哪些是一般变量,哪些是指针)。
因此,要分配一块所谓二维的内存块,只有先分配一块内存块存放许多指针,然后再给每个指针分配一块内存使之指向它。 删除时先删除每个指针所指向的内存块,再删除这些指针占据的内存块。 对应于你上面的程序段,可这样删除:
for(int nCount=0;nCount<i;i++)
delete lp[nCount];
delete lp;
删的时候出错!
删除数组,难道不要用delete[]吗?只要delete就行了吗?
A:
long **lp=new long*[i];
for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];B:
long ** i;
i=(long **)new long[4][5];
你的申请方法是对的.我的删除方法也错了.
应该是
for ( ....)delete[] *(i+index);
delete[] i;这样看的话,可以写一个类,用于申请和删除二维数组.
不知道有没有更好的方法
看来我的C++还是学的不行.
不过我会常来csdn要大家请教的.刚才我说用类来申请二维数组,仔细想想问题也很多,不太可行,
大家以为呢.
Item ** allocate_2DArray (const size_t ksizeRowInit,
const size_t ksizeColInit)
{
Item ** prgprgitemTemp;
size_t i;
ssizeRow = ksizeRowInit;
ssizeCol = ksizeColInit;
prgprgitemTemp = new Item * [ksizeRowInit];
for (i=0; i<ksizeColInit; i++)
prgprgitemTemp[i] = new Item [ksizeColInit];
return prgprgitemTemp;
}template <typename Item>
void free_2DArray(Item ** prgprgitemToFree)
{
size_t i;
for (i=0; i<ssizeRow; i++)
delete [] prgprgitemToFree[i];
delete [] prgprgitemToFree;
}
int *pArray = new int [ m * n];然后动态的使用int I24 = *(pArray + m * 4 + 2);这样删除也很简单,以此类推,也可使用三维的动态数组int *pArray = new int [ m * n * p];
int I325 = *(pArray + m * n * 5 + n * 2 + 3);
同样多维空间都需要后n-1维固定.
这是编译器的要求.不过,你可以用for循环来分配,这是可以的.
其他前面大家都说过了.呵呵
*,&,[]的关系是一个c程序员必须知道的基本知识
#pragma hdrstop
#include <condefs.h>
#include<stdio.h>
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
int a[2][2]={1,2,3,4};
if(**a==a[0][0])
printf("**a==a[0][0] is right");
if(*a==&(a[0]))
printf("*a==*(a[0]) is right");
}
当然,这只是个想法,我没试过。
typedef long * PLONG;
PLONG * pp=new PLONG[20];
pp[0]=new long[10];
pp[1]=new long[10];
pp[0][0]=1;
pp[0][1]=2; delete []pp[0];
delete []pp[1];
delete []pp;
用mfc的CObjectArray不更是小菜一蝶吗?
你的写法其实和我上面的帖子是一样的:
long **lp=new long*[i];肯定是正确的,lp只是一个指向指针的指针(指向一个指针数组),指针数组中的每一个指针还需要象你下面写的那样初始化:for(int nCount=0;nCount<i;nCount++)lp[nCount]=new long[j];删除时正好相反,看我上面的帖子吧,照着写一个循环就可以了。
Btw, ssizeRow is the static varable for row, and ssizeCol for colomn.