动态内存分分配
大多数程序在运行时,计算机中会有部分的内存未分配,这些内存叫堆或叫自由存储器。我们可以用new操作符在堆中为特定类型的变量分配空间,返回值是分配给此变量的内存地址。释放分配的空间是用delete操作符。
在内存中操作指针比操作变量本身速度更快更有效,特别是对于数组。
一 给简单变量分配动态内存
如我们要在内存中给一double型变量分配空间,我们可以先声明一个double型指针,然后再给此对象赋值:
double* pdata=NULL;
pdata=new double;
*pdata=3.665;(等同于pdata=new doulbe(3.665);)
delete pdata;
pdata=0;(或pdata=NULL).
pdata=new double(3.665)为初始值,即在分配内存空间时指定的值,而*pdata=3.665是给对象赋值。
delete pdata;是销毁用new 分配的空间。
在delete指针后,最好带上pdata=0.表示此指针已不指向任何值。
二 给数组分配动态内存
为数组分配动态内存非常简单,如为一数组分配一个指针pstring.
char* pstring=new char[20];
即数组为20个元素的char类型数组,此时pstring指向第一个元素。
*(pstring+1)为第二个元素的值.
数组销毁时用 delete [] pstring. 中括号表示删除的变量为数组变量。变量删除后为防止原变量指针被其它程序占用,把变量指针设置为0即可,即pstring=0;
以下为操作整形类型的例子:
#include <iostream>
using namespace std;
void main()
{
int* p=new int[3]; //分配内存空间
*p=11; //给相关元素赋值
*(p+1)=50;
*(p+2)=33;
for(int i=0;i<3;i++)
printf("元素[%d]的地址 %x, 内容: %d\n",i,p+i,*(p+i));
delete [] p; //销毁分配的数组空间
p=0; //清查指针,使其不指向任何数据
}
显示结果为:
数组的空间是连续分配的,int类型的大小为4个字节,你会发现每个指针位置相差一个整型即4个字节。
如果是多维数组,和一维数组一样操作。
如 int* p=new int[10][15][20];
销毁时也是用delete [] p即可。