C++二维数组动态申请内存
好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了。怪我,大二下实在太颓废了,没啥作为。
今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的。今天用到了,顺便写下来,适当时候给C++初学者用用。
-----------C++二维数组动态申请内存--------------
如果对new和delete不是很了解的话可以到这里来看看,http://www.cnblogs.com/hazir/p/new_and_delete.html
首先,我们一般需要用到数组的时候,都是直接声明,比如:
int array[][];
但是,在某些情况下,数组的维数我们是不知道的,可能是等待用户输入维数,这时候需要用变量来指定维数了。可是,我们不能直接这样声明数组,因为C++不允许直接用变量作为维数声明,必须用常量,像这样就会报编译错误:

这时候就需要用new来动态申请数组了。我们一步一步来,申请一维数组的时候,我们可以这样写:
int num = ;
int* array = new int[num];
这段代码的意思就是,用new来申请num个int类型的空间,然后返回那段空间的首地址,再赋给array。可见array是一个int类型的指针,指向那段空间的首地址。语法和逻辑无误,正常运行。
但是,申请二维数组的时候,就可能要对指针这一知识点要掌握得比较好一点,理解得比较透彻。先贴代码,再分析:
int num = ;
int** array = new int*[num];
for(int i=; i<num; ++i) {
array[i] = new int[num];
}
看完这段代码,还是有点糊涂的。为什么array是int**类型?为什么还要用循环来分配空间?我们再来看下面注释版的代码:
int num = ;
(int*)* array = new int*[num]; // 申请int*类型数组的内存空间,赋值给(int*)*类型的array
for(int i=; i<num; ++i) {
array[i] = new int[num]; // 分别给int*类型的数组申请空间,即一维数组的动态申请。
}
现在我来解释一下,其实我们可以把二维数组理解成为很多一维数组的集合。比如说:int array[4][3],其实它就是由4个长度为3的一维数组组成的。array[0]指的就是第一个一维数组。可以推出,array[0],array[1],array[2], array[3]就是int*类型的指针,用来分别指向一维数组。那么,array又是什么呢?很显然,array就是(int*)*类型的指针,指向刚才那4个int*指针类型占用空间的首地址。有点绕?看图:

因此,联系上图,我们先new4个int*类型,将首地址赋值给array。再用循环每次new4个int类型,首地址指向对应的int*类型的指针。
了解之后,我们当然要用delete释放内存,就不细说了,怎么申请怎么释放,并且是逆着回来释放空间,看代码:
for(int i=; i<num; i++) {
delete[] array[i];
}
delete[] array;
好吧!我已经尽量讲得很详细了!其实这段代码不难,认真思考一下就行了。可是我还是苦口婆心的很仔细的讲了,可能为了以后和我一样的菜鸟刚学指针时有缘看到这篇博客可以对他有些帮助吧,其实我已经对这个烂熟于心了,为什么还要这么仔细得写呢?会不会浪费时间浪费精力?我不知道,可能再熟悉再小的问题,也可能会有自己不懂的学问在里面吧。总之,每篇博客,尽量写到最好!
停笔!过几天会更新关于new和delete的知识点!

C++二维数组动态申请内存的更多相关文章
- C Program进阶-二维数组动态内存开辟
对于二维数组,我们知道可以用Type ArrayName[Row][Colume]的方式来定义,这是一种静态内存开辟的方式,程序在编译的时候就为该数组分配了空间,而且行和列大小也是指定的.这篇文章里我 ...
- C++基础:二维数组动态的申请内存和释放内存
使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数 ...
- C++二维数组动态内存分配
对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...
- 2017.11.17 C++系列---用malloc动态给c++二维数组的申请与释放操作
方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...
- c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...
- Java学习之二维数组定义与内存分配详解
二维数组:就是元素为一维数组的一个数组. 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. n:表示每一个一维数组的元素有多少个. 注意: ...
- 10、二维数组的申请(test7.java)
我个人认为,二维数组的构造就是在一位数组中存入一个地址,这个地址指向另一个一位数组,这样通过这种排列组合便构造成了二维数组. 二维数组的形状,有的时候二维数组看起来像是一个矩阵,所以一般情况下如果涉及 ...
- JavaScript中给二维数组动态添加元素的质朴方法
var myData = new Array(); for(var i=0;i<tableDatas.length;i++){ var arr=tableDatas[i]; ...... /// ...
- c++ 二维数组传递
c++ 二维数组传递 我们在传递二维数组时,对于新手来说,可能会存在某些问题,下面讲解几种传递方法 在讲解如何传递二维数组时,先看看如何动态new 二维数组 // 二维数组动态申请 int row , ...
随机推荐
- (转)ping命令
ping命令 原文:https://www.cnblogs.com/peida/archive/2013/03/06/2945407.html Linux系统的ping命令是常用的网络命令,它通常用来 ...
- LeetCode 62.不同路径(C++)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问总共有多 ...
- jQuery源代码学习笔记_bind
一般想到JS的兼容性问题的时候,首先会想到addEventListener与attachEvent这一对冤家,那么我们先来看看它们有什么兼容性问题 addEventListener与attachEve ...
- Devexpress Xtrareports 创建多栏报表
根据官方回答:多列或多行(取决于当前的多栏设置)呈现数据的报表 这种报表是有用的,例如,当每个明细区都只显示少量数据.并且需要在一列的右侧打印下一个明细区时,这样就能充分利用整个页面的宽度,此外,当创 ...
- Hibernate课程 初探一对多映射4-3 测试--信息查询
建立双向一对多关系,既可以由一方查询多方信息,同样可以由多方查询一方信息 demo: //查询学生所在班级 public static void showGidByStudent(){ Session ...
- 一些实用的浏览器meta
标签: 兼容性 meta 通用 <!--声明文档使用的字符编码--> <meta charset='utf-8′> <!--viewport定义--> <me ...
- jQuery 显示与隐藏 tab选项卡
方法一:使用display样式:block.none来控制文本的显示与隐藏 <div class="explain_text"> 移动互联网为企业提供了连接用户的新方式 ...
- 栅格那点儿事(四B)---多波段栅格数据的显示
多波段栅格数据的显示 我上面说了这么多,可能有的人会觉得平时也根本用不上.自然,说起影像数据,大家接触到对多的就是最最常见的航片或卫片.对于这种栅格数据呢,大多数的场景下,都只需实现一个效果,就是最接 ...
- 转:ArcGIS10.1正式版安装与破解
一.准备文件 ArcGIS10.1安装包:ArcGIS_Desktop_10.1_129026(en) 认证服务:Pre-release_license_manager 注册机:arcgis10.1K ...
- java学习笔记之基础知识
1.class不加修饰符默认default,只在当前包里能用. 2.构造函数前面的修饰符的作用类似class的,限制引用的权限. 3.java对象的创建其实就是类的实例化,类的实例化就是在堆上copy ...