4.3.3 使用new申请动态数组

    第3章讨论了通过声明建立数组的方法,实际上,可以通过new[]命令动态创建数组,其基本格式如下所示。

    类型名*指针变量名=new类型名[元素个数];

    上述语句通知编译器动态开辟足以存储“元素个数”类型为“类型名”的元素的连续内存空间(数组),并声明“指针变量名”,指向数组的第一个元素。

    与通过声明建立数组不同,使用new申请动态数组时,元素个数可以是变量,如下所示。


    int i=5 int*p=new int[i];//合法

    这样,便可以在程序运行时决定应给数组分配的空间大小,而使用声明建立数组时,为了避免数组越界,一般都会将数组的维数尽量设大一点,因此造成了内存的浪费,使用new动态申请数组可以克服这一弊端。

    注意

    new无法对动态申请的数组存储区进行初始化。

    对于动态申请的数组,在使用完毕后,应使用“delete[]”命令将内存释放,其基本格式如下所示。


    delete[]指针;

    方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。因此,一定要注意new和delete的配对使用,“new&delete”用于为一个实体分配内存,而“new[]&delete[]”用于为数组分配内存。

    代码4.5 使用new申请动态数组OperatorNew


    <—————————————文件名:example405.cpp——————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 int num=0; 06 cout<<"请输入数组个数:"<<endl; 07 cin>>num; 08 cout<<"请依次输入"<<num<<"个整数(用空格隔开):"<<endl; 09 //申请一块可存放num个int型数据的动态内存,将首地址赋值给指针pSz 10 int*pSz=new int[num]; 11 for(int i=0;i<num;i++) 12 cin>>pSz[i];//for循环结构为动态数组中的元素赋值 13 for(i=0;i<num;i++) 14 cout<<"第"<<i<<"个数为:"<<pSz[i]<<endl;//对数组元素依次输出 15 delete[]pSz;//释放动态内存 16 return 0; 17 }

    输出结果如下所示。


    请输入数组个数: 3(注:键盘输入) 请依次输入3个整数(用空格隔开): 12 17 9(注:键盘输入) 第0个数为:12 第1个数为:17 第2个数为:9

    【代码解析】代码第10行,接收用户输入一个整数,依此确定要声明的内存块的大小,体现了new命令的优势所在,同时,使用指针pSz来对数组元素进行输入输出操作,最后,使用delete命令对申请的内存区域进行释放。