【原文】http://blog.csdn.net/shanzhizi/article/details/7835752

数组的动态分配、初始化和释放经常用到,这里总结一下,尤其是二维数组

一维数组

一维数组的动态分配,初始化和撤销都好说,几乎每一本C++教材都会做出详细的说明。具体如下:
动态分配: int *array=new int [n];
初始化:memset(array,0,n*sizeof(array));       (也可以利用一个for循环对其赋值初始化)
撤销:delete [] array;

二维数组

下面来说二维数组的。

动态分配:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来进行这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
[cpp] view plaincopy
  1. int **array;
  2. array=new int *[10];
  3. for(int i=0;i<10;i++)
  4. array[i]=new int [5];

上面的操作完成了一个10行5列的二维数组array[10][5]的动态分配,可以看到我们先动态分配了一个10单元的数组的指针的指针的首地址给**array,然后再对其每个首地址进行遍历,同时完成一个5单元的数组的动态分分配,并把首地址给*array[i],从而最终完成了二维数组array[10][5]的动态分配。我们可以依此类推得到三维以至多维的数组的动态分配方法。

初始化:
如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。这就要理解到memset这个函数三个参数的含义。MSDNhttp://blog.csdn.net/shanzhizi对memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。我的理解是memset只作用于一块连续的内存空间,而动态开辟的空间不一定是连续的,所以具体写法如下:
[cpp] view plaincopy
  1. int **array;
  2. array=new int *[10];
  3. for(int i=0;i<10;i++)
  4. {
  5. array[i]=new int [5];
  6. memset(array[i],0,5*sizeof(int)); //注意这里是array[i]
  7. }

可以看到这里的memset的第三个参数有了变化。
撤销:

[cpp] view plaincopy
  1. for (int i = 0; i < 10; i ++)
  2. {
  3. delete[] array[i];
  4. }
  5. delete [] array;

三维数组

类似于二维数组,用一个例子说明:

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <memory.h>
  3. #define size1 5
  4. #define size2 10
  5. #define size3 15
  6. int main()
  7. {
  8. int *** arr;
  9. int i,j,k;
  10. /// 动态开辟 相当于arr[size1][size2][size3]
  11. arr = new int**[size1];
  12. for (i = 0; i < size1; i ++) {
  13. arr[i] = new int*[size2];
  14. for (j = 0; j < size2; j ++) {
  15. arr[i][j] = new int[size3];
  16. }
  17. }
  18. /// 用for循环初始化
  19. for (i = 0; i < size1; i ++) {
  20. for (j = 0; j < size2; j ++) {
  21. for (k = 0; k < size3; k ++) {
  22. arr[i][j][k] = i * j * k;
  23. }
  24. }
  25. }
  26. for (i = 0; i < size1; i ++) {
  27. for (j = 0; j < size2; j ++) {
  28. for (k = 0; k < size3; k ++) {
  29. printf("i*j*k=%d*%d*%d=%d/n",i,j,k,arr[i][j][k]);
  30. }
  31. }
  32. }
  33. /// 用memset,如果是静态int arr[][][]的话,直接memset(arr,0,sizeof(arr));数组初始化为0
  34. for (i = 0; i < size1; i ++) {
  35. for (j = 0; j < size2; j ++) {
  36. memset(arr[i][j],-1,sizeof(int) * size3);
  37. }
  38. }
  39. for (i = 0; i < size1; i ++) {
  40. for (j = 0; j < size2; j ++) {
  41. for (k = 0; k < size3; k ++) {
  42. printf("i,j,k=%d,%d,%d=%d/n",i,j,k,arr[i][j][k]);
  43. }
  44. }
  45. }
  46. / 释放内存
  47. for (i = 0; i < size1; i ++) {
  48. for (j = 0; j < size2; j ++) {
  49. delete[] arr[i][j];
  50. }
  51. delete[] arr[i];
  52. }
  53. delete[] arr;
  54. return 0;
  55. }

C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete相关推荐

  1. python中numpy中一维二维三维数组的意思

    python中numpy中一维二维三维数组的意思: 以下为一维二维三维数组图形化: 那么一维通俗点就是行(横着看)只有这个,别无二家. 二维通俗点就是行(横着看)+列(竖着看),只有这种形式. 三维比 ...

  2. Matlab中矩阵编号方式以及一维二维三维数据间的相互转换

    Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 文章目录 Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 一.问题的提出 二.一维数据转为二维和三维 三.三维数据转为一维和二维 ...

  3. 对一维二维三维数组的分析 及其 np.shape 的输出

    [1,2]的shape值(2,),意思是一维数组,数组中有2个元素. [[1],[2]]的shape值是(2,1),意思是一个二维数组,2行1列,每行有1个元素. [[1,2]]的shape值是(1, ...

  4. IDL 合并一维二维三维数组

    一维数组(行数相同) array3 = [array1,array2] 二维数组(列数相同) array3 = [[array1],[array2]] 三维数组(行列数都相同) array = [[[ ...

  5. 二维数组:随机生产,遍历,判断两个数组一维二维长度,和内容是否一致

    import java.util.Random;/*** 1,定义第一个方法,传入数组长度,返回一个1维和2维长度都完全相同的数组* 2.定义一个方法,传入两个数二维组,判断两个数组是否完全一致:一维 ...

  6. c语言三维数组 三维指针,C语言 通过指针访问一维数组,二维数组,三维数组。...

    /** 通过指针来访问一维数组,二维数组,多维数组 */ #include const int COLS=3; const int COUNT=4; //通过一级指针,计算偏移量来遍历一维数组 voi ...

  7. c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?

    C++| 匠心之作 从0到1入门学编程[免费]​yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...

  8. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

  9. 怎样定义和引用一维数组,二维数组

    s1,s2,s3,...,s30 右下角的数字称为下标(subscript) 一批具有同名的同属性的数据就组成了一个数组(array),s就是数组名. 1.怎样定义和引用一维数组 一维数组.二维数组. ...

最新文章

  1. 解除计算机软件开发协议书,计算机软件著作权转让的协议书
  2. 团队作业1——团队展示选题
  3. semget创建文件_linux信号灯操作
  4. python表示矩阵
  5. 演讲预告:一个月的住院经历,我悟到了哪些和程序员职场发展相关的心得
  6. 代码命名,代码里的命名规则:错误的和正确的对比 命名方法总结 “自我描述的源代码”用代码表达出你的思想,让其他人通过代码能明白你的意图。...
  7. java基本数据类型转为String类型的4种常见方法
  8. 文件服务器ping延时大,windowns 2008 ping 127.0.0.1延迟大的解决方法。
  9. java基础—计算: 2012-3-17到2012-4-6中间有多少天?
  10. Winfrom窗体无法关闭问题--检查是否存在重写
  11. Outlook常见问题解决方案
  12. c语言 异或_C语言位运算实例讲解
  13. 推荐系统实践(四)----基于标签的推荐算法
  14. 计算机开机画面怎么有2个用户,win7开机画面有两个用户登录 ,怎么样隐藏其中一个(管理员帐号)...
  15. 小猪佩奇与Tom猫的一场内网友谊赛
  16. 移动端安全 | Windows11安卓子系统进行APP抓包(踩坑文)
  17. python 扩展c extention
  18. 2022-2023 通信工程专业毕业设计题目选题推荐 - 100例
  19. 2015 计蒜之道 初赛 第一场 搜狗输入法的分词算法
  20. 唯有硬核,方显本色丨云和恩墨五位数据库专家即将亮相openGauss Developer Day

热门文章

  1. ajax 中文乱码问题 主要是IE浏览器
  2. start.s中的.balignl 16,0xdeadbeef
  3. 到底什么是极简主义?
  4. [导入]博客搬家了,呵呵
  5. 华为OJ平台——放苹果(典型整数划分问题)
  6. layout_weight layout_gravity gravity
  7. fatal error RC1004: unexpected end of file found处理方法
  8. 深入理解Javascript之执行上下文(Execution Context)
  9. 安装Rational Enterprise Suite(Robot...)时遇到的问题及解决办法!
  10. Facebook 上一位大佬发表的代码看法