动态数组可以有两种使用方式:

1:不能预先知道数组的大小使用动态数组

传统数组(静态数组)是需要在程序运行前,就指定大小,比如说

int i = 10;

int a[i];

这种就是不合法的。

因为函数栈的要求,就是在函数运行前,分配好所有变量的空间,i是不定的,所以不能再运行前,就分配好空间。

但是大多数情况,我们并不能预先知道数组的大小的。

所以我们使用动态数组

int *a = new int[i];

这个语句就可以在执行的时候,才分配空间,是合法的。

2:大数组存储时栈区是有大小限制

传统数组是存放在栈区的,栈区是有大小限制的,如果你申请了一个大于2M的数组,程序就会报错……

但是动态数组是在堆空间的,理论上,内存有多大,就可以申请多大的数组。

在vc中栈默认是1M;有时创建一个a[1000000000]甚至更长的数组时栈会不够用,与此同时,即使数组不是太大,例如a[1000000],一次申请连续的数组会造成资源的浪费,并且可能因为很多因素内存的分配不能进行,而得不到内存。所以动态数组可以最大的限度节省内存空间。

一维动态数组的创建和删除

int *p = 0;
 p = new int[10];//创建
 delete [] p;

二维动态数组的创建和删除,以创建一个二维矩阵为例

double **data =0;//定义一个二维的指针
data = new double *[rsize];  //创建矩阵的行
  for (int i = 0; i < rsize; i++)
  {
   data[i] = new double[csize];  //data[i] 此时是指针,创建矩阵的列
  }
  for (int i = 0; i < rsize; i++)
   for (int j = 0; j < csize; j++)
    data[i][j] = 0;  //初始化
 /*****二维动态数组删除****/
 for (int i = 0; i < y; ++i)
{         
  delete p[i];//释放内存。
  p[i] = NULL;//释放空间后将p[i]指向NULL值,
 }
delete []p;
 p = NULL;

new出来的数组它的逻辑地址(虚拟地址)是连续的,所以可以用遍历来读取,但物理地址是不一定的(因为要大数组存储,这个是操作系统的事情,用户不用关心)。

c++动态数组的优点,创建和删除的更多相关文章

  1. vc++基础班[28]---动态数组及动态链表的讲解

    C++中也有相应的动态数组.动态链表.映射表的模板类,就是STL中的:vector.list.map 他们属于C++标准中的一部分,对于程序的移植性来说也是不错的,但是在MFC编程中使用 CArray ...

  2. [UE4]C 语言动态数组

    在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定.对于这种问题,用静态数组的办法很难解决.为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指 ...

  3. [转]delphi 删除动态数组的指定元素

    type TArr = array of TPoint; {把数组先定义成一个类型会方便许多, 这里仅用 TPoint 测试} {删除动态数组指定元素的过程: 参数 arr 是数组名, 参数 Inde ...

  4. js动态创建表格,删除行列的小例子

    js动态创建表格,删除行列的实例代码. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  5. 容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)

    1.问题的提出 在没有了解vector之前,动态数组一般都是又new创建的.在了解vector后发现vector竟是那样方便好用,但方便的同时却是以牺牲执行效率为代价的.网上对vector和array ...

  6. WPF 中动态创建和删除控件

    原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName(" ...

  7. 一篇文章让你了解动态数组的数据结构的实现过程(Java 实现)

    目录 数组基础简单回顾 二次封装数组类设计 基本设计 向数组中添加元素 在数组中查询元素和修改元素 数组中的包含.搜索和删除元素 使用泛型使该类更加通用(能够存放 "任意" 数据类 ...

  8. [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)

    [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...

  9. C++之动态数组

    C99支持一种名为变长数组的结构来方便程序员.C++也提供了一种长度可在程序运行时确定的数组类型:动态数组.声明格式为:(声明 int 类型的数组) ; //此处可修改 ArraySize 的值 in ...

随机推荐

  1. 【Weiss】【第03章】练习3.9:大整数运算包

    [练习3.9] 编写任意精度的整数运算包,要求使用类似多项式运算的方法.计算24000内数字0到9的分布.

  2. 测试必知必会系列- Linux常用命令 - ps(重点)

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 查看所 ...

  3. 2018 巅峰极客CTF misc writeup

    flows 拿到一个pcap包,用wireshark打开,发现是USB协议,尝试在kali下使用tshark提取,提取失败,发现异常.回到wireshark分析数据.在其中一个数据包中发现了tip 把 ...

  4. Linux下反弹shell笔记

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...

  5. 微信开发+百度AI学习:微信网页开发环境搭建

    参考微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 两步即可获取微信网页开发能力 STEP1: ...

  6. Servlet(一)----快速入门

    ## Servlet:server applet *  概念:运行在服务端的小程序 *  servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则. *  将来我们自定义一 ...

  7. 贪心-Bag of Tokens

    2020-01-20 22:32:28 问题描述: 问题求解: 双指针 + 贪心. public int bagOfTokensScore(int[] tokens, int P) { Arrays. ...

  8. mysqlbinlog错误:Error in Log_event::read_log_event(): 'read error'

    环境: mysql 5.6 ; binlog  3.4 ; binlog_format MIXED ; .报错: mysqlbinlog -v --start-position=166084123 m ...

  9. linux execl()函数 关于execl()函数族的用法不在赘述,

    linux execl()函数 关于execl()函数族的用法不在赘述, linux 网络编程 1---(基本概念) 1.TCP和UDP协议 共同点:同为传输层协议 不同点: TCP:有连接,可靠 U ...

  10. 在Ubuntu中安装OpenCV-Python | 三

    在本教程中,我们将学习在Ubuntu System中设置OpenCV-Python.以下步骤针对Ubuntu 16.04和18.04(均为64位)进行了测试. 可以通过两种方式在Ubuntu中安装Op ...