您的位置:首页 > 其它

如何动态创建和使用二维数组

2008-12-09 11:51 381 查看
1、动态创建二维数组
正确的做法:
方法一:

void fun(int iRow, int iCol)
{
CString** ppData;
ppData = new CString*[iRow];

for(int i=0;i< iRow;++i)
{
ppData[i] = new CString[iCol];
}
}

方法二:
void fun(int iRow, int iCol)
{
CString* pTemp;
CString** ppData;
pTemp =new CString[iRow*iCol];
ppData = new CString*[iRow];

for(int i=0;i< iRow;++i)
{
ppData[i] =&pTemp[i*iCol];
}
}

ppData就是我们创建的二维数组。

错误的做法:

void fun(int iRow, int iCol)
{
CString** ppData;
ppData = new CString[iRow][iCol];
}
错误提示:error C2540: non-constant expression as array bound

2、使用二维数组
(1)我们在应用中有时候会需要把一个二维数组作为参数传入一个函数中,这个函数的形式怎样才是正确的?
void fun(CString** str, int iRow, int iCol); 正确
void fun(CString str[][], int iRow, int iCol); 错误,没有指定数组的列数!
void fun(CString* str, int iRow, int iCol); 正确,可以在函数内部对str处理,变成一个二维数组

(2)现在我们定义了fun,
void fun(CString** str, int iRow, int iCol);
然后我们需要在外面传入一个二维数组,应该如何传入?
正确做法:
CString** test;
//分配test的空间,给test初始化值
……
fun(test, 2, 1);

错误的做法:
CString test[2][1];
//给test初始化值
……
fun(test, 2, 1);
会提示错误:cannot convert parameter 1 from 'WTL::CString [2][1]' to 'WTL::CString **'

(3)如果需要把申请的二维数组的指针传给一个struct的成员,要注意先申请struct的空间
struct Info
{
CString** data;
int x;
int y;
}
错误的语句:
Info* infoTest;
//申请ppData空间
infoTest->data = ppData; 出错!崩溃

正确的语句是:
Info* infoTest = (Info*)malloc(sizeof(Info)); 正确
//申请ppData空间
infoTest->data = ppData;

(4)删除二维指针
对于方法一创建的数组:

int j;
for(j=0;j< iRow;j++)
{
delete[] ppData[j];
}
delete[] ppData;
【注:方法一:

void fun(int iRow, int iCol)
{
CString** ppData;
ppData = new CString*[iRow];

for(int i=0;i< iRow;++i)
{
ppData[i] = new CString[iCol];
}
}


对于方法二创建的数组:
delete[] ppData;
delete[] pTemp;

【注:方法二:

void fun(int iRow, int iCol)
{
CString* pTemp;
CString** ppData;
pTemp =new CString[iRow*iCol];
ppData = new CString*[iRow];

for(int i=0;i< iRow;++i)
{
ppData[i] =&pTemp[i*iCol];
}
}】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: