您的位置:首页 > 其它

4.7.6  使用 new 来创建动态数组

2015-06-07 23:19 204 查看
使用常规数组存储数据时,一般都是在程序编译时就已经为数组分配好了内存。如果存储的数据未达到数组的长度,就会导致很多内存闲置,致使效率较低。

对于处理一些大型数据,我们就可以使用 new 进行动态内存分配。常规通过声明来创建数组,则在程序被编译时就已经为它分配好了内存空间,不管程序最终是否使用数组,数组都在那里,它占用了内存。但使用 new 时,可以在运行阶段判断是否使用数组以及使用数组需要的长度。这种在运行时为数组分配内存方式称为动态联编。而这种在程序运行时创建的数组被称为动态数组。

一、使用 new 创建动态数组

只需将数组的元素类型和元素的数目信息告诉 new 即可。

语法规则:

pointerType * pointerName = new arrayType [Asize];


注释: pointerType 指针类型;pointerName 指针名; arrayType 数组元素类型; Asize 数组元素的数目(既可以是变量也可以是常量)

例如:创建一个包含10个int元素的动态数组: int * psome = new int [10];

说明:new 运算符返回的是第一个元素的地址。在该例子中,这个地址被赋值给 psome。

二、使用 delete 释放动态数组内存

当程序使用完 new 创建的内存后需要使用 delete 对内存进行释放。

语法规则:

delete [] pointerName;


说明: [ ] 方括号不能省略,它表明释放的是整个数组。

三、使用 new 和 delete 时,应遵循的规则:

①不要使用delete来释放不是new分配的内存。

②不要使用delete释放同一个内存两次甚至多次。

③如果使用new[ ]为数组分配内存,则应该使用delete[ ]来释放。

④如果new为一个实体分配内存,则应使用delete(没有方括号)来释放。

⑤对空指针应用delete是安全的。

四、 为数组分配内存的通用格式:

type_name * pointer_name = new type_name [num_elements];


五、使用动态数组

因为C++内部是使用指针来处理数组的。因此数组和指针基本上是等价的。就可以把指针当作数组名使用。例如,对于第一个元素就是 psome[0];对于第二个元素就是psome[1],以此类推。

[code]程序清单  4.18  arraynew.cpp
//
//  main.cpp
//  first
//
//  Created by 刘伟 on 15/5/30.
//  Copyright (c) 2015年 刘伟. All rights reserved.

//C++ primer plus
//程序清单4.18   arraynew.cpp
//arraynew.cpp -- using the new operator for arrays

#include<iostream>
using namespace std;

int main()
{
    double *p3 = new double [3];     // space for 3 doubles
    p3[0] = 0.2;                     // treat p3 like an array name
    p3[1] = 0.5;
    p3[2] = 0.8;
    cout << "regard p3 as a array, we can use a value of array:" << endl;
    cout << "p3[1] is " << p3[1] << endl;
    cout << "regard p3 as a array, we can use total:" << endl;
    cout << "p3[0]+p3[1]+p3[2]="<<p3[0]+p3[1]+p3[2]<< endl;
    cout << "actually,p3 is a pointer!"<< endl;
    cout << "increment the pointer."<< endl;
    p3 = p3 + 1;    // 指针和数组的区别:不能修改数组的值,但是指针是变量,因此可以修改它的值.
    cout << "p3[0] is " << p3[0] << endl;
    cout << "p3[1] is " << p3[1] << endl;
    cout << "point back to beginning."<< endl;
    p3 = p3 - 1;
    cout << "free the memory!"<< endl;
    delete [] p3;

    return 0;
}


程序输出示例:

regard p3 as a array, we can use a value of array:

p3[1] is 0.5

regard p3 as a array, we can use total:

p3[0]+p3[1]+p3[2]=1.5

actually,p3 is a pointer!

increment the pointer.

p3[0] is 0.5

p3[1] is 0.8

point back to beginning.

free the memory!

Program ended with exit code: 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: