C++ 二维数组/多维数组的动态分配(new)和释放(delete)

1. 一维数组

对于简单的一维数组动态内存分配和释放,如下:

int *array1D;//假定数组长度为m

//动态分配空间
array1D = new int [m];

//释放
delete [] array1D;

2. 二维数组

二维数组的动态分配和释放

//假定数组第一维长度为m, 第二维长度为n

//动态分配空间
<pre name="code" class="cpp">int **array2D<span style="font-family: Arial, Helvetica, sans-serif;"> = new int *[m];</span>

for( int i=0; i<m; i++ ){ array2D[i] = new int [n] ;}//释放for( int i=0; i<m; i++ ){ delete [] arrar2D[i];}delete array2D;//我觉得应该是 delete [] array2D;


P.S. 事实上二维数组空间的释放还可以更简单地用:delete [] array2D;

二维数组的另一种分配和释放形式:

//假设第一维长为m,第二维长为n

//动态分配空间
<pre name="code" class="cpp">int** array2D=new int*[m];
array2D[0]=new int[m*n];
for(int i=1;i<m;++i)
  array2D[i]=array2D[i-1]+n;

//释放delete [] array2D[0];delete [] array2D;


3. 三维数组

三维数组的动态分配和释放

int ***array3D;//假定数组第一维为m, 第二维为n, 第三维为h

//动态分配空间
array3D = new int **[m];
for( int i=0; i<m; i++ )
{
    array3D[i] = new int *[n];
    for( int j=0; j<n; j++ )
    {
         array3D[i][j] = new int [h];
    }
}

//释放
for( int i=0; i<m; i++ )
{
    for( int j=0; j<n; j++ )
    {
         delete array3D[i][j];//觉得应该是 delete [] array3D[i][j];
    }
    delete array3D[i];//觉得应该是 delete [] array3D[i];
}
delete array3D;//觉得应该是 delete [] array3D;

4. 二维数组的一个例子

其中的析构函数用到了delete,构造函数用到了new进行分配。

// W4-课程作业-填空题1-3.cpp : Defines the entry point for the console application.
/*
写一个二维数组类 Array2,使得下面程序的输出结果是:
输入
无
输出
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
next
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
*/

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
// 在此处补充你的代码
class Array2
{
private:
	int hang, lie;
	int **iar;
public:
	Array2() :hang(0), lie(0), iar(NULL) {}
	Array2(int h, int l) :hang(h), lie(l)
	{
		iar = new int*[h];
		iar[0] = new int[h*l];
		for (int i = 1; i < h; ++i)
			iar[i] = iar[i - 1] + l;
	}
	~Array2()
	{
		//cout << "";
		if (iar != NULL)
		{
			delete[] iar[0];  //delete的方式要对,不然就会出现_Block_Type_Is_Valid (pHead->nBlockUse) Error
			delete[] iar;
		}
	}
	int*& operator[](int m)
	{
		return iar[m];
	}
	const int operator() (int m, int n)
	{
		return iar[m][n];
	}
	Array2& operator=(const Array2& ar)
	{
		if (ar.iar == iar) return *this;
		if (iar != NULL)
		{
			for (int i = 0; i < hang; ++i)
				delete[] iar[i];
			delete[] iar;
		}
		if (ar.iar != NULL)
		{
			hang = ar.hang;
			lie = ar.lie;
			iar = new int*[hang];
			iar[0] = new int[hang*lie];
			for (int i = 1; i < hang; ++i)
				iar[i] = iar[i - 1] + lie;
			for (int i = 0; i < hang; ++i)
				for (int j = 0; j < lie; ++j)
					iar[i][j] = ar.iar[i][j];
		}
		else
		{
			hang = 0;
			lie = 0;
			iar = NULL;
		}
		return *this;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	Array2 a(3, 4);
	int i, j;
	for (i = 0; i < 3; ++i)
		for (j = 0; j < 4; j++)
			a[i][j] = i * 4 + j;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << a(i, j) << ",";
		}
		cout << endl;
	}
	cout << "next" << endl;
	Array2 b;
	b = a;
	for (i = 0; i < 3; ++i) {
		for (j = 0; j < 4; j++) {
			cout << b[i][j] << ",";
		}
		cout << endl;
	}

	return 0;
}

参考:http://www.cnblogs.com/Sylla-Zhang/archive/2012/10/08/2715300.html

c++ 二维数组new小结    主要讲各种形式的优缺点

时间: 2024-10-13 19:27:25

C++ 二维数组/多维数组的动态分配(new)和释放(delete)的相关文章

java数组(一维数组,二维数组)

数组初始化: 1,动态初始化:数组定义与为数组分配空间和赋值的操作分开进行 2,静态初始化:在定义数组的同时就为数组元素分配空间并赋值 3,默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此,数组分配空间之后 每个元素也被按照成员的规则被隐士的初始化值 ------------------------------------------------. 一维数组: package day06; import java.util.Date; /*** * 数组演示 * 数组的声明: * t

环形二维数组最大子数组的和

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu

二维数组,矩形数组 集合

二维数组,矩形数组 集合 二维数组,矩形数组集合 一.二维数组: 一维数组----豆角 二维数组----表格 1)定义: 一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2)二维数组: 数据类型[,] 数组变量名 = new 数据类型[行数,列数]; int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值       下标都是从0开始的 取值: a[行下标

二维数组,锯齿数组和集合

一.二维数组 二维数组:一维数组----豆角二维数组----表格 定义:1.一维数组:数据类型[] 数组变量名 = new 数据类型[数组长度];数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2.二维数组:数据类型[,] 数组变量名 = new 数据类型[行数,列数];int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值 下标都是从0开始的取值: a[行下标,列下标] 题目:一个班6个人,从键盘输入每个学号语文,数学,外语成

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

数组(一维数组、二维数组)

数组概述 C# 数组从零开始建立索引,即数组索引从零开始.C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似.但还有一些差异应引起注意. 这些其实和泛型有些类似,数组的操作没有泛型方便,但是性能却不是泛型所能比拟的 声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面.在 C# 中,将方括号放在标识符后是不合法的语法. int[] table; // not int table[]; 另一细节是,数组的大小不是其类型的一部分,而在 C 语言中它却是数组类型的一部分.这使您可

将二维数组转为一维数组的2种方法

如何将下面的二维数组转为一维数组. 代码如下: $msg = array( array( 'id'=>'45', 'name'=>'jack' ), array( 'id'=>'34', 'name'=>'mary' ), array( 'id'=>'78', 'name'=>'lili' ), ); 第一种方法: 代码如下: foreach($msg as $k => $v){ $ids[] = $id; $names[] = $name; } 第二种方法: 代

20160423 二维数组,锯齿数组和集合

2016-04-23  20:46:26 一.二维数组: 一维数组----豆角 二维数组----表格 1)定义: 一维数组: 数据类型[] 数组变量名 = new 数据类型[数组长度]; 数据类型[] 数组变量名 = new 数据类型[数组长度]{1,2,3....}; 2)二维数组: 数据类型[,] 数组变量名 = new 数据类型[行数,列数]; int[,] a = new int[3,4]; 赋值: a[行下标,列下标] = 值       下标都是从0开始的 取值: a[行下标,列下标

C语言第五讲:二维数组,多维数组

一.二维数组 二维数组的定义:数据类型  数组名[常量表达式1][常量表达式2] = {值1, 值2,....值n}; 例如: int array[3][3] = {{1, 2, 3}, {2, 1, 3}, {3, 1, 2}}; 二维数组array[3][3] 相当于是由三个含有三个元素的一维数组所组成的. 数组元素个数怎么求:两个维度的下标相乘 访问二维数组中的元素:双下标 多维数组 : 三维数组:数组名[常量表达式1][常量表达式2][常量表达式3] = {值1, 值2,....值n};