使用new来创建动态数组

原文来自:http://book.51cto.com/art/201211/367161.htm

使用new来创建动态数组(1)

如果程序只需要一个值,则可能会声明一个简单变量,因为对于管理一个小型数据对象来说,这样做比使用new和指针更简单,尽管给人留下的印象不那么深刻。通常,对于大型数据(如数组、字符串和结构),应使用new,这正是new的用武之地。例如,假设要编写一个程序,它是否需要数组取决于运行时用户提供的信息。如果通过声明来创建数组,则在程序被编译时将为它分配内存空间。不管程序最终是否使用数组,数组都在那里,它占用了内存。在编译时给数组分配内存被称为静态联编(static binding),意味着数组是在编译时加入到程序中的。但使用new时,如果在运行阶段需要数组,则创建它;如果不需要,则不创建。还可以在程序运行时选择数组的长度。这被称为动态联编(dynamic binding),意味着数组是在程序运行时创建的。这种数组叫作动态数组(dynamic array)。使用静态联编时,必须在编写程序时指定数组的长度;使用动态联编时,程序将在运行时确定数组的长度。

下面来看一下关于动态数组的两个基本问题:如何使用C++的new运算符创建数组以及如何使用指针访问数组元素。

1.使用new创建动态数组

在C++中,创建动态数组很容易;只要将数组的元素类型和元素数目告诉new即可。必须在类型名后加上方括号,其中包含元素数目。例如,要创建一个包含10个int元素的数组,可以这样做:

 

new运算符返回第一个元素的地址。在这个例子中,该地址被赋给指针psome。

当程序使用完new分配的内存块时,应使用delete释放它们。然而,对于使用new创建的数组,应使用另一种格式的delete来释放:

 

方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。请注意delete和指针之间的方括号。如果使用new时,不带方括号,则使用delete时,也不应带方括号。如果使用new时带方括号,则使用delete时也应带方括号。C++的早期版本无法识别方括号表示法。然而,对于ANSI/ISO标准来说,new与delete的格式不匹配导致的后果是不确定的,这意味着程序员不能依赖于某种特定的行为。

总之,使用new和delete时,应遵守以下规则。

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

不要使用delete释放同一个内存块两次。

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

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

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

现在我们回过头来讨论动态数组。psome是指向一个int(数组第一个元素)的指针。您的责任是跟踪内存块中的元素个数。也就是说,由于编译器不能对psome是指向10个整数中的第1个这种情况进行跟踪,因此编写程序时,必须让程序跟踪元素的数目。

实际上,程序确实跟踪了分配的内存量,以便以后使用delete [ ]运算符时能够正确地释放这些内存。但这种信息不是公用的,例如,不能使用sizeof运算符来确定动态分配的数组包含的字节数。

为数组分配内存的通用格式如下:

 

使用new运算符可以确保内存块足以存储num_elements个类型为type_name的元素,而pointer_name将指向第1个元素。下面将会看到,可以以使用数组名的方式来使用pointer_name。

2.使用动态数组

创建动态数组后,如何使用它呢?首先,从概念上考虑这个问题。下面的语句创建指针psome,它指向包含10个int值的内存块中的第1个元素:

 

可以将它看作是一根指向该元素的手指。假设int占4个字节,则将手指沿正确的方向移动4个字节,手指将指向第2个元素。总共有10个元素,这就是手指的移动范围。因此,new语句提供了识别内存块中每个元素所需的全部信息。

现在从实际角度考虑这个问题。如何访问其中的元素呢?第一个元素不成问题。由于psome指向数组的第1个元素,因此*psome是第1个元素的值。这样,还有9个元素。如果没有使用过C语言,下面这种最简单的方法可能会令您大吃一惊:只要把指针当作数组名使用即可。也就是说,对于第1个元素,可以使用psome[0],而不是*psome;对于第2个元素,可以使用psome[1],依此类推。这样,使用指针来访问动态数组就非常简单了,虽然还不知道为何这种方法管用。可以这样做的原因是,C和C++内部都使用指针来处理数组。数组和指针基本等价是C和C++的优点之一(这在有时候也是个问题,但这是另一码事)。稍后将更详细地介绍这种等同性。

首先,程序清单4.18演示了如何使用new来创建动态数组以及使用数组表示法来访问元素;它还指出了指针和真正的数组名之间的根本差别。

使用new来创建动态数组(2)

程序清单4.18  arraynew.cpp

 

下面是该程序的输出:

 

从中可知,arraynew.cpp将指针p3当作数组名来使用,p3[0]为第1个元素,依次类推。下面的代码行指出了数组名和指针之间的根本差别:

 

不能修改数组名的值。但指针是变量,因此可以修改它的值。请注意将p3加1的效果。表达式p3[0]现在指的是数组的第2个值。因此,将p3加1导致它指向第2个元素而不是第1个。将它减1后,指针将指向原来的值,这样程序便可以给delete[ ]提供正确的地址。

相邻的int地址通常相差2个字节或4个字节,而将p3加1后,它将指向下一个元素的地址,这表明指针算术有一些特别的地方。情况确实如此。

时间: 2024-11-24 12:12:46

使用new来创建动态数组的相关文章

使用new创建动态数组

使用new创建动态数组 例如: 1 int *psome=new int[10]; 要将数组的类型和元素的数目告诉new即可. new运算符返回第一个元素的地址. 当程序使用完new分配的内存块时,要使用delete释放. 1 delete[]psome; 方括号的意思就是释放整个数组. 总之,使用new和delete时,应遵守: 1.不要使用delete释放不是new分配的内存: 2.不要使用delete释放同一个内存块两次: 3.如果使用new[]为数组分配内存,就要使用[]释放: 4.如果

【C++ Primer每日一刷之八】之九 创建动态数组

4.3.1. 创建动态数组 数组类型的变量有三个重要的限制:[数组长度固定不变],[在编译时必须知道其长度],[数组只在定义它的块语句内存在]. 实际的程序往往不能忍受这样的限制--它们需要在运行时动态地分配数组. 虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度.与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止.每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆. C 语言程

【C++ Primer每日一刷之九】创建动态数组

表达式 C++ 提供了丰富的操作符,并定义操作数为内置类型时,这些操作符的含义.除此之外,C++ 还支持操作符重载,允许程序员自定义用于类类型时操作符的含义.标准库正是使用这种功能定义用于库类型的操作符. 本章重点介绍 C++ 语言定义的操作符,它们使用内置类型的操作数:本章还会介绍一些标准库定义的操作符.第十四章将学习如何定义自己的重载操作符. 表达式由一个或多个操作数通过操作符组合而成.最简单的表达式仅包含一个字面值常量或变量.较复杂的表达式则由操作符以及一个或多个操作数构成. 每个表达式都

C++中使用模板,new创建2维动态数组

1 // 使用模板和new创建2维动态数组 2 3 #include<iostream> 4 #include<exception> 5 #include<cstdlib> 6 #include<iomanip> 7 using namespace std; 8 9 template<class Type> 10 bool Make2DArray(Type **&x,int rows,int cols) 11 { 12 int i; 13

C++中创建动态2维数组

1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 5 template<class Type> 6 void Make2DArray(Type **&x,int rows,int cols) 7 { 8 // 创建一个行指针 9 x=new Type *[rows]; 10 for(int i=0;i<rows;i++) 11 { 12 x[i]=new Type [cols

动态数组

动态数组也叫数组的动态联编,有动态联编自然也有静态联编,静态联编就是数组的长度在编译时设置,而动态联编是在运行时才为数组分配空间,其长度在运行时设置,使用完这种动态数组后,应该释放内存. 静态联编:int arr[10];       //数组长度为一常量 动态数组在ISO C99后就有了新的规定(如下图文件): 这是部分说明,完整的说明在 ISO/IEC9899 标准的 6.7.5.2 Array declarators里可以看到,这个里面加入了可变长数组的相关规定. #include <io

int[]里数的个数怎么由输入决定?-----动态数组。

java中如何创建动态数组?(摘自百度知道) Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayList作为Java动态数组的创建以及用法. 1.语法:add()是添加一个新的元素,remove()删除一个元素,size()获得ArrayList的长度.ArrayList的下标是从0开始.2.示例代码import java.util.ArrayLis

C++中关于[]静态数组和new分配的动态数组的区别分析

这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解.具体区别如下: 一.对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小:因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度.int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(i

Powershell 数组的使用(一)【动态数组】

在上文中我们介绍了如何使用[静态数组],内容涉及到数组的创建.元素的添加删除等操作,很显然,通过该种方式去操作一个数组是非常麻烦的,静态数组的目的在于让大家了解数组的基本概念和操作,在实际使用数组的脚本中,我们会创建动态数组来更好的提高脚本运算速度和易编写性. 动态数组.使用.Net的类来进行定义,它除了像静态数组一样可以进行比较,索引查找外还可以很方便的进行元素变更,在循环添加元素时它也是自由的去添加单个元素而不是重新定义整个数组,因而极大的提高了脚本的运算速度. 一. 动态数组的定义,动态数