C++二维数组动态内存分配

对于二维数组和二维指针的内存的分配

这里首选说一下一维指针和一维数组的内存分配情况。

一维:

数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是通过a我们能找到这五个元素。注意:a是代表数组第一个元素的首地址。&a是代表数组的地址,虽然它们的值相同。

指针: int *p = NULL;这里p是一个指针,它指向的是计算

机内一块存储int类型的内存。P = a;就是让p等于刚才申请的数组的第一个元素的地址。所以通过p我们也能找到那5个元素所以P[i]跟a[i]的作用一样。

注意:

1:int *p = NULL; p的大小在32位机器是4,即使p=a;之后p的sizeof(p)仍然等于4。

2:在声明之后,数组必须分配内存进行初始化。而指针一般是动态分配其指向的内存。

3:不要混淆指针和数组,指针就是指针,数组就是数组,只是数组在一定条件下可以转换成指针。不要将指针和数组混淆。(例如:指针有++,--操作,数组则不可以)。

一维指针的动态内存分配:

int *p = NULL;

p = new int[N];

千万别忘了delete

delete [] p;

p = NULL;

二维数组的内存分配

int a[2][3];   这里分配了一个2X3=6个int大小的数组。二维数组的第二个维度3不能省略。

二维数组的内存在计算机内也是连续的一片地址,只不过每3个元素构成一个一维数组a[i],这里的a[i]代表维度为3的数组的第一个元素的地址。所以a[i][j]的访问跟a[i]的访问也就清楚了。这里的a[i]其实是一个一维数组的第一个元素的地址。

对于二维数组做实参,我们通常用一维指针处理,例如:

 1 #include <iostream>
 2 void test(int *p)
 3 {
 4     for (int i = 0;i<3;++i)
 5     {
 6         for(int j = 0;j<3;++j)
 7         {
 8             std::cout<<*(p+3*i+j); //一维处理
 9         }
10     }
11 }
12 int main(void)
13 {
14     int a[3][3]={1,2,3,4,5,6,7,0,0};
15     test((int*)a);     //将二维数组当做一维处理
16     system("pause");
17     return 0;
18 }

这些想必书上讲的都非常清楚。

二维数组的C++动态内存分配。

二维指针的动态数组分配:二维指针类似指针数组的分配

int **p;

 1 #include <iostream>
 2 int main(void)
 3 {
 4     int **p = NULL;       //这里申请一个3x4的二维数组
 5     p = new int *[3];     //分配一维指针,分配三个int* 类型的一维指针。
 6     for (int i = 0;i < 3; ++i)
 7     {
 8         p[i] = new int[4];
 9     }
10     for (int i = 0; i < 3; ++i)
11     {
12         for(int j = 0; j < 4 ; ++j)
13         {
14             p[i][j] = i*j;
15             std::cout<<p[i][j]<<" ";
16         }
17         std::cout<<std::endl;
18     }
19
20     for (int i = 0;i < 3;++i)    //释放
21     {
22         delete [] p[i];
23     }
24     delete [] p;
25     system("pause");
26     return 0;
27 }

指针数组的动态内存分配

指针数组的动态内存分配只需要对指针数组的数组元素指针分别分配内存即可,比二维指针的分配少了一个环节。

 1 #include <iostream>
 2 int main(void)
 3 {
 4     int *a[3];    //申请含有三个int* 类型的指针数组
 5                   //跟二维指针不同的是,这里数组a不用手动申请内存
 6     for (int i = 0;i < 3;++i)  //申请一个3x4的空间
 7     {
 8         a[i] = new int[4];
 9     }
10     for (int i = 0; i<3 ;++i)
11     {
12         for (int j = 0; j<4; ++j)
13         {
14             a[i][j] = i*j;
15             std::cout<<a[i][j]<<" ";
16         }
17         std::cout<<std::endl;
18     }
19
20     for (int i = 0;i <3 ;++i)  //分别释放三个指针元素,由于数组在栈区,会自动释放
21     {
22         delete [] a[i];
23     }
24     system("pause");
25     return 0;
26 }

数组指针的动态内存分配

数组指针就是指向数组的指针,说白了就是指向一个数组整体,因此分配的时候直接申请一片内存地址即可。跟二维数组的静态分配类似。

1 // Karllen
2 int main(void)
3 {
4     int (*a)[4];     //这里的4是第二维的维度,a的增量的基数为4个int
5     a = new int[3][4];
6     delete []a;
7         a = NULL;
8     return 0;
9 }

用的最多的就是上面的几种方法。一次性分配二维数组的内存还有多种方法可以实现。我也是刚接触这些东西,希望大家能提出不正确的地方。共勉!!!

时间: 2024-10-20 16:45:36

C++二维数组动态内存分配的相关文章

一维和二维数组 动态内存分配

一维数组的动态内存分配 #include "stdafx.h" #include <iostream> using namespace std; int main() { int length,i; int *p; cin>>length; p=new int[length]; for(i=0;i<length;i++) { p[i]=i; //不要写成*p[i]=i; cout<<p[i]<<endl; //不要写成cout<

C++二维数组动态申请内存

好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到了,顺便写下来,适当时候给C++初学者用用. -----------C++二维数组动态申请内存-------------- 如果对new和delete不是很了解的话可以到这里来看看,http://www.cnblogs.com/hazir/p/new_and_delete.html 首先,我们一般需

C++基础:二维数组动态的申请内存和释放内存

使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数组 void dynamicCreate1Array() { int m; int i; int *p; cout<<("please input the length of data:"); cin >> m; p = (int*)malloc(sizeof(in

二维数组动态开辟

#include<stdio.h> #include<malloc.h> #include<stdlib.h> void main() { int **a; int m,n; printf("请输入数组大小m行,n列\n"); scanf("%d %d",&m,&n); a = (int **)malloc(sizeof(int*)*m);         //开辟行 if(NULL == a) {    prin

JavaScript中给二维数组动态添加元素的质朴方法

var myData = new Array(); for(var i=0;i<tableDatas.length;i++){ var arr=tableDatas[i]; ...... /// myData[i]=new Array(); myData[i][0]=arr[2].toString(); myData[i][1]=parseFloat(arr[3]); } drawGraph(myData); 如上,采取是元素赋值的方式,push的做法用不通,如果你知道请留言.

C++二维数组内存分配

在C++中,用new和delete分配和释放内存: 1.例如,给一个4*5的二维数组分配内存 方法一:直接申请二维数组,逐一分配内存 1 int **array; 2 //分配内存 3 array=new int*[4]; 4 5 for (int i=0;i<4;i++) 6 array[i]=new int[5]; 7 8 //释放内存 9 for (int i=0;i<4;i++) 10 delete[] array[i]; 11 12 delete[] array; 方法二:按照一维数

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------

【C++】动态开辟二维数组

二维数组在内存中的分配例如以下: C方式呈现: <span style="font-size:18px;"> #include <iostream> using namespace std; #define ROW 3 #define COL 4 void main() { int **p = (int **)malloc(sizeof(int*)*ROW); for(int i=0; i<ROW; ++i) { p[i] = (int *)malloc(

创建动态二维数组

1 //======================================================== 2 //创建动态二维数组a [M] [N]: 3 //思路一:二维数组的抽象理解: 4 //思路二:二维数组在内存中实际排列: 5 //======================================================== 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <