Chinaunix首页 | 论坛 | 博客
  • 博客访问: 381403
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:34:08

  最近,经常看到在论坛的VC板块看到有人问有关于动态创建二维数组的人,自己准备写一篇出来。
  记得自己刚学习C的时候,就需要学习数组,不过在学校里,我最多就是学到了二维数组,并且自己使用的也绝大部分是一维数组。后来,快毕业的时候,程序中需要一个使用动态的二维数组,那时候没有老师可以请教,自己摸索着,竟然被我弄出来了一段代码,可以动态创建二维数组(这段代码有可能是不正确的,希望行家不要取笑,只需要提出意见就可以了):

#include <stdio.h>

#include <iostream.h>
 

const int ROW = 10;

const int COL = 12;

 

int main()

{

  int iRow=0, iCol=0;

  //创建数组

       cout<<"Create array"<<endl;

  int **ppint = new int*[ROW];

  for(iRow=0;iRow<ROW;iRow++){

    ppint[iRow] = new int[COL];

  }

  //进行计算

  cout<<"TODO sth."<<endl;

  for(iRow=0;iRow<ROW;iRow++){

    for(iCol=0;iCol<COL;iCol++){

      ppint[iRow][iCol] = iRow+iCol;

    }

  }

  //输出

  cout<<"use the array"<<endl;

  for(iRow=0;iRow<ROW;iRow++){

    for(iCol=0;iCol<COL;iCol++){

      cout<<"["<<iRow<<"]["<<iCol<<"]"<<ppint[iRow][iCol]<<";";

    }

    cout<<endl;

  }

  //删除

  cout<<endl<<"Now, delete the array"<<endl;

  for(iRow=0;iRow<ROW;iRow++){

    delete[] ppint[iRow];

  }

  delete[] ppint;
  ppint = NULL;

  //

  cout<<"Press return to exit......."<<endl;

  getchar();

  return 0;

}

  上面的代码,演示了怎样创建、使用以及删除一个二维数组。这段代码虽然是我刚刚写的,但是早已成型于2002年底。我不知道这段代码创建一个二维数组有什么错误,但是一直到现在我仍在使用。

------------------------------------------------------------------------------

  上面的代码,是我自己琢磨出来的。后来,2003年来到北京工作,一个偶然的机会,看到C/C++有一个模板库,支持动态创建二维数组与删除二维数组,再后来,又在网上看到有人提供了一个宏来创建二维数组。
  关于那个创建与删除二维数组的模板,这下子我忘记了,自己写了一个类似的(如果写错了,还是那句话:只需要贴出正确的就可以了,少量的批评也行,就是不要骂人了

#include <stdio.h>

#include <iostream.h>

 

template <class T>

T** CreateMatrix(int nRow, int nCol)

{

  T **ppT = new T*[nRow];

  for(int iRow = 0;iRow<nRow;iRow++){

    ppT[iRow] = new T[nCol];

  }

  return ppT;

}

 

template <class T>

void DeleteMatrix(T ***pppT, int nRow)

{

  for(int iRow=0; iRow<nRow; iRow++){

    delete[] (*pppT)[iRow];

  }

  delete[] (*pppT);

  (*pppT) = NULL;

}

 

const int ROW = 10;

const int COL = 12;

 

int main()

{

  int iRow=0, iCol=0;

  //创建数组

       cout<<"Create array"<<endl;

  int **ppint = CreateMatrix<int>(ROW, COL);

  //进行计算

  cout<<"TODO sth."<<endl;

  for(iRow=0;iRow<ROW;iRow++){

    for(iCol=0;iCol<COL;iCol++){

      ppint[iRow][iCol] = iRow+iCol;

    }

  }

  //输出

  cout<<"use the array"<<endl;

  for(iRow=0;iRow<ROW;iRow++){

    for(iCol=0;iCol<COL;iCol++){

      cout<<"["<<iRow<<"]["<<iCol<<"]"<<ppint[iRow][iCol]<<";";

    }

    cout<<endl;

  }

  //删除

  cout<<endl<<"Now, delete the array"<<endl;

  DeleteMatrix<int>(&ppint, ROW);

  //

  cout<<"Pres return to exit......."<<endl;

  getchar();

  return 0;

}
  经过我的测试,输出的结果是一样的。

------------------------------------------------------------------------------

  至于那个使用宏来生成二维数组,个人不推荐,所以这里也就不贴出来了(主要是自己手头没有,而自己又懒得不愿意写)。

------------------------------------------------------------------------------

题外话:自己本来想测试一下这段代码是否正确的(虽然在实际使用中是正确的),想把内存中的内容给分析一下,但是发现自己是在使看不懂二维数组在内存中的表示。如果有谁能够分析验证一下,hengai先在这里谢过了!


--------------------next---------------------

 to 清风雨

我仅仅实现的就是一个模拟的二维数组,关于那些类似于 = 的操作符,我不需要重载。昨天本来想自己实现一个能够动态生成的二维数组类,结果因为自己的水平确实不行,一个晚上都没有实现。我的想法是:假设要求的二维数组为ROW*COL,那么我先在内存中分配一个 new T[ROW*COL];也就是说使用线形的方式存储一个二维数组。
记得以前看到过pAnic兄(好像是他),回答一个人的问题“关于 foo(char p[][])与 foo(char **p) 有什么不同),昨天晚上自己也始了一下,个人认为,这就是传递一个二维数组与双重指针,如果我是使用 char p[10][12]那么只能是以 foo(char p[][])这种形式传递,如果这个 char p[][] 是按照我上面贴子所生成的方法,那么就需要使用 foo(char **p),两者之间绝对不能混用。
另外,我昨天晚上就是在重载[][]操作符上碰到了问题,我知道,如果我使用 GetAt 函数,可以很容易的解决这个问题,但是我需要的就是按照习惯,因为按照使用习惯,人们一般都是使用 p[row][col]来访问二维数组而不是使用 GetAt(row, col)来访问。

另外,我有一点说错了,这里自我批评:“我以为多次new一段小内存的效率会高于一次性new大段的内存”,这句话是错的。以前看过一篇文章,说“如果需要频繁的分配内存,可以先使用HeapAlloc来一大段的内存,然后在从这里划分”。再次自我批评一下。
2005-07-10 14:15 |

--------------------next---------------------

阅读(155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~