一个动态分配二维数组程序的特例
来源:互联网 发布:录入软件 编辑:程序博客网 时间:2024/05/17 04:38
通常,动态分配二维数组的原型为:
- T **dmalloc(int rows, int cols);
- void dfree(T** p, int rows);
写成模板后的代码:
- #include<iostream>
- using namespace std;
- template<class T>
- T **dmalloc(int rows, int cols)
- {
- int i;
- T **p = NULL;
- p = new T*[rows];
- for(i = 0; i < rows; i++)
- {
- p[i] = new T[cols];
- }
- return p;
- }
- template<class T>
- void dfree(T** p, int rows)
- {
- for(int i = 0; i < rows; i++)
- delete[] p[i];
- delete[] p;
- p = NULL;
- }
- int main()
- {
- int **p = dmalloc<int>(10,20);
- p[0][2] = 10;
- cout<<p[0][2];
- dfree(p,10);
- return 0;
- }
但这里提供的原型是这样的:
- T** dmalloc(int rows, int cols);
- void dfree(T** p);//只有一个参数,没有rows这个形参
实现后的模板代码为:
- #include<iostream>
- using namespace std;
- template<class T>
- T** dmalloc(int rows, int cols)
- {
- char *p = new char[rows*sizeof(char *) + sizeof(int)];
- int *p1 = (int *)(p);
- *p1 = rows;
- p1++;
- T **p3 = (T**)p1;
- for(int i = 0; i < rows; i++)
- p3[i] = new T[cols];
- return p3;
- }
- template<class T>
- void dfree(T** p)
- {
- int *p1 = (int*)p;
- int rows = *--p1;
- // printf("%d/n",rows);
- T** p2 = (T**)++p1;
- for(int i = 0; i < rows; i++)
- delete[] p2[i];
- char *p3 = (char*)(--p2);
- delete[] p3;
- }
- void main()
- {
- int **p = dmalloc<int>(10,20);
- p[3][0] = 3;
- p[0][2] = 10;
- // p[100][100] = 12;
- // printf("%d",p[3][0]);
- dfree(p);
- }
总结:
通常我们把数组作为参数,要传递首地址和元素个数,但这里的函数原型没有元素个数,我们就要想一个办法将元素个数存储在数组中,当然可以给数组做一个结束标记,但这里的解决方法是将元素个数这个int值存储在数组首地址之前的4个字节中。
- 一个动态分配二维数组程序的特例
- 一个动态分配二维数组的ANSI C程序
- 二维数组的动态分配
- 二维数组的动态分配
- 二维数组的动态分配
- 二维数组的动态分配
- C++二维数组的动态分配
- 动态分配二维数组的实现
- 有关二维数组的动态分配
- C++二维数组的动态分配
- 探索二维数组的动态分配
- 为一个二维数组动态分配&释放内存
- 动态分配二维数组的若干方法
- C++中动态分配二维数组的方法
- 关于二维数组的动态分配空间
- 二维数组的动态分配和删除
- 二维数组的动态分配和删除(转载)
- C++中二维数组的动态分配
- 【开心一刻】具有中国特色的脑筋急转弯
- 连接数据库的第三种方法
- SEO 优化
- 成长!
- 哦也
- 一个动态分配二维数组程序的特例
- Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005'
- 毕业设计
- 笛卡尔积
- linux设备模型中ktype的用法
- 【原创】Xp下Android手机开发环境搭建
- 腹蛇毒素
- struts2 validator
- 项目