文档章节

C++(7)动态数组

Simon丶Ma
 Simon丶Ma
发布于 2016/04/14 14:28
字数 881
阅读 5
收藏 0

动态数组


序言:

   数组类型变量有三个限制:

    1)数组长度固定不变

    2)在编译时必须知道其长度

    3)数组只能在定义他的语句块内存在

   与数组变量不同:动态分配的数组将一直存在直到程序显示的释放他!


正文:

1每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区,或堆(heap),在C++中使用newdelete在自由存储区中分配存储空间。

   new表达式返回指向新分配数组的第一个元素的指针:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //数组的维数可以是任意复杂的表达式  
  2. int *pia = new int[10];  

2、在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接访问堆中的对象。


3、动态分配数组时,如果数组类型具有类类型,将调用该类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. string *psa = new string[10];  
  2. int *pia = new int[10];  

4、可以跟在数组长度后面的一对空圆括号,对数组元素进行值初始化。

   但是对于动态分配的数组,只能初始化为元素的默认值,不能像数组变量一样...

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int *pi = new int[10]();  

5const对象的动态数组

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. const int *pci_bad = new const int[10]; //ERROR  
  2. const int *pci_ok = new const int[10]();//OK  

在实际应用中其实没有太大用处...


6、动态空间的释放

    动态分配的内存到最后必须进行释放,否则,内存最终将会耗尽。如果不再需要使用动态创建的数组,则必须显式的将所占用的存储空间返还给程序的自由存储空间!

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. delete []pia;   //不要忘记了[],即使忘记了,编译器也不会发现...  

7、动态数组的使用

    通常就是在编译时无法知道数组的维数,所以才使用动态数组!

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.    const char *errno = "success";  
  2.    const char *errinfo = "Error: a function declaration must "  
  3.                          "specify a function return type!";  
  4.   
  5.    const char *errTxt;  
  6.    if (errFound)  
  7.     errTxt = errinfo;  
  8. else  
  9.     errTxt = errno;  
  10.   
  11. /* 
  12. *在获得字符串的长度上,必须+1,以便在动态分配内存时 
  13. *预留出存储结束符的空间 
  14. */  
  15. int dimension = strlen(errTxt) + 1;  
  16. char *errMsg = new char[dimension];  
  17. strncpy(errMsg,errTxt,dimension);  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //P120 习题4.28  
  2. int main()  
  3. {  
  4.     vector<int> ivec;  
  5.     int value;  
  6.   
  7.     while (cin >> value)  
  8.     {  
  9.         ivec.push_back(value);  
  10.     }  
  11.   
  12.     int *arr = new int[ivec.size()];  
  13.     for (size_t index = 0; index != ivec.size(); ++index)  
  14.     {  
  15.         arr[index] = ivec[index];  
  16.         cout << arr[index] << ' ';  
  17.     }  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span>delete []arr;  
  2.     cout << endl;  
  3. }  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //4.29测试下面两段程序的执行时间  
  2.     const char *pc = "very long literal string";  
  3.     const size_t len = strlen(pc);  
  4.   
  5.     for (size_t ix = 0; ix != 1000000; ++ix)  
  6.     {  
  7.         char *pc2 = new char[len + 1];  
  8.         strcpy(pc2,pc);  
  9.         if (strcmp(pc2,pc))  
  10.             ;  
  11.         delete []pc2;  
  12.     }  
  13. //execution time : 0.121 s  
  14.   
  15.     const string obj("very long literal string");  
  16.   
  17.     for (size_t sz = 0; sz != 1000000; ++sz)  
  18.     {  
  19.         string str = obj;  
  20.         if (str != obj)  
  21.             ;  
  22.     }  
  23. //execution time : 0.071 s   

可以看出使用string类型的程序执行速度要比用C风格字符串快很多!!!



[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //习题4.30  
  2. //(1)  
  3. int main()  
  4. {  
  5.     const char *str1 = "hello";  
  6.     const char *str2 = "world";  
  7.     const size_t sz = strlen(str1) + strlen(str2) + 2;  
  8.   
  9.     char *strLarg = new char[sz];  
  10.     strncpy(strLarg,str1,strlen(str1) + 1);  
  11.     strncat(strLarg," ",2);  
  12.     strncat(strLarg,str2,sizeof(str2) + 1);  
  13.   
  14.     cout << strLarg << endl;  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.     delete []strLarg;  
  2.     //execution time : 0.002 s  
  3. }  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //(2)  
  2. int main()  
  3. {  
  4.     string str1("hello");  
  5.     string str2("world");  
  6.     string strLarg = str1 + " " + str2;  
  7.   
  8.     cout << strLarg << endl;  
  9.     //execution time : 0.002 s  
  10. }  

© 著作权归作者所有

Simon丶Ma
粉丝 4
博文 134
码字总数 299850
作品 0
深圳
程序员
私信 提问
C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用。很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下...

chenyufeng1991
2016/08/21
0
0
Effective STL - 容器

STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。 STL容器是同质的,即存储的值的类型相同;算法是完成特...

積木leayn
2013/10/07
144
0
如何在C/C++中动态分配二维数组

如何在C/C++中动态分配二维数组 在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而...

长平狐
2012/12/10
188
0
C++ STL编程轻松入门 4

 2.2.2 第二版:工业时代--组件化大生产   我们应该庆幸自己所生活的年代。工业时代,科技的发展所带来的巨大便利已经影响到了我们生活中的每个细节。如果你还在以原始人类的方式生活着,...

暖冰
2015/11/21
60
0
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201812.html 文章 鸡啄米:C++编程入门系列之前言 鸡啄米:C++编程入门系列之一(进制...

开元中国2015
2015/06/27
83
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官问:平时碰到系统CPU飙高和频繁GC,你会怎么排查?

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运...

Java高级架构师n
28分钟前
12
0
面向对象编程

1、类和对象 类是对象的蓝图和模板,而对象是实例;即对象是具体的实例,类是一个抽象的模板 当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定...

huijue
今天
15
0
redis异常解决 :idea启动本地redis出现 jedis.exceptions.JedisDataException: NOAUTH Authentication required

第一次安装在本地redis服务,试试跑项目,结果却出现nested exception is redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required错误,真是让人头疼 先检查一...

青慕
今天
27
0
Spring 之 IoC 源码分析 (基于注解方式)

一、 IoC 理论 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。 二、IoC方式 Spring为IoC提供了2种方式,一种是基于xml...

星爵22
今天
31
0
Docker安装PostgresSql

Docker安装PostgresSql 拉取docker镜像 # docker pull postgres:10.1010.10: Pulling from library/postgres9fc222b64b0a: Pull complete 38296355136d: Pull complete 2809e135bbdb: Pu......

Tree
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部