文档章节

c/c++中动态的申请二维数组的实现

klaus丶
 klaus丶
发布于 2014/05/09 19:08
字数 630
阅读 216
收藏 0
#include "stdafx.h"
#include <iostream>
#include <new>
#include <string>
#include <cstdlib>

using namespace std;

//c++语言实现申请动态二维数组 new delete
template<class T>
T** new_Array2D(int row, int col)
{
	int size = sizeof(T);
	int point_size = sizeof(T*);
	//先申请内存空间,其中sizeof(T*)*row表示存放row个行指针
	T** arr = (T**)malloc(point_size*row + size*row*col);
	if (arr != NULL)
	{
		T *head = (T*)((int)arr + point_size*row);
		for (int i=0; i<row; i++)
		{
			arr[i] = (T*)((int)head + i*col*size);
			for (int j=0; j<col; j++)
			{
				new (&arr[i][j])T;
			}
		}
	}
	return (T**)arr;
}

//释放二组数组
template<class T>
void delete_Arrar2D(T** arr,int row, int col)
{
	for (int i=0; i<row; i++)
	{
		for (int j=0; j<col; j++)
		{
			arr[i][j].~T();
		}
	}
	if (arr != NULL)
	{
		free((void**)arr);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int nRow,nCol;
	//输入行和列数
	scanf("%d,%d",&nRow,&nCol);
	
	//动态申请连续的二维数组
	string**p = new_Array2D<string>(nRow, nCol);

	
	//赋值
	int i, j;
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			char szTemp[30];
			sprintf(szTemp,"%d",(i+1)*(j+1));
			p[i][j] = szTemp;
		}
	}
	
	//二维数组的输出
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<nCol; j++)
		{
			printf("%4s",p[i][j].c_str());
		}
		putchar('\n');
	}
	
	delete_Arrar2D<string>(p, nRow, nCol);
	return 0;
}
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

//申请二维数组 malloc free
template<typename T>
T** malloc_Array2D(int row, int col)
{
	int size = sizeof(T);
	int point_size = sizeof(T*);

	//先申请内存,其中point_size *row表示存放row个行指针
	T **arr = (T**)malloc(point_size*row + size*row*col);
	if (arr != NULL)
	{
		memset(arr,0, point_size*row + size*row*col);
		T *head  =(T*)((int)arr + point_size*row);
		while (row --)
		{
			arr[row] = (T*)((int)head + row*col*size);
		}
	}
	return (T**)arr;
}

//释放二组数组
void free_Array2D(void **arr)
{
	if (arr != NULL)
	{
		free(arr);
	}
}
//int _tmain(int argc, _TCHAR* argv[])
//{
//	int nRow,nCol;
//	//输入行和列数
//	scanf("%d,%d",&nRow,&nCol);
//
//	int **p = malloc_Array2D<int>(nRow, nCol);
//
//	//赋值
//	int i, j;
//	for (i=0; i<nRow; i++)
//	{
//		for (j=0; j<nCol; j++)
//		{
//			p[i][j] = (i+1)*(j+1);
//		}
//	}
//
//	//二维数组的输出
//	for (i=0; i<nRow; i++)
//	{
//		for (j=0; j<nCol; j++)
//		{
//			printf("%4d",p[i][j]);
//		}
//		putchar('\n');
//	}
//
//	free_Array2D((void**)p);
//}
#include "stdafx.h"
#include <iostream>
using namespace std;
//用C程序实现动态申请列大小固定的二维数组
int _tmain(int argc, _TCHAR* argv[])
{
	//列大小固定的二维数组可以申请一维数组并将指针强转成二维数组
	//列值固定
	const int MAXCOL = 3;

	int nRow;
	scanf("%d",&nRow);//输入一个行数

	//申请一维数据并将其转成二维数组指针
	int *pp_arr = new int[nRow*MAXCOL];
	int (*p)[MAXCOL] = (int(*)[MAXCOL])pp_arr;

	//为二维数组赋值
	int i, j;
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<MAXCOL;j++)
		{
			p[i][j] = (i+1)*(j+1);
		}
	}

	//二维数组的输出
	for (i=0; i<nRow; i++)
	{
		for (j=0; j<MAXCOL; j++)
		{
			printf("%5d",p[i][j]);
		}
		putchar('\n');
	}

	delete[] pp_arr;
	return 0;
}


© 著作权归作者所有

klaus丶
粉丝 0
博文 48
码字总数 10481
作品 0
海淀
程序员
私信 提问
如何在C/C++中动态分配二维数组

如何在C/C++中动态分配二维数组 在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而...

长平狐
2012/12/10
194
0
C语言编程基础学习如何定义一维数组和二维数组

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/04/01
0
0
C语言/C++编程学习—神秘小游戏制作源代码

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/03/25
0
0
【广州】我想应聘一个C/C++/java软件开发职位

本人预计六月底七月初将去广州生活。希望在广州找到一份c/c++/java方面的软件开发职位。 以下 是我的简历,希望广州地区的it企业可以联系我。 周西的个人简历 姓  名: 周西 性  别: 男...

numcpp
2012/06/07
537
1
10个Objective-C基础面试题,iOS面试必备

苹果的iOS系统越来越火了,苹果这个金矿平台也吸引了大量的iOS开发者参与其中,这也促使越来越多的公司向iOS应用开发方向靠拢,因此市场上 对iOS开发的人才需求自然也非常巨大。如果你准备去...

ruby_chen
2013/07/15
56.2K
18

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部