如果通过像下面这样一般的方法来声明数组,则在程序编译的时候为其分配内存,不管程序最终是否用到这个数组,数组都在那里并占用内存,即静态联编。但是如果使用new,则在运行阶段需要它才进行创建,不需要则不创建,这叫动态联编,这种创建的数组叫做动态数组。并且静态联编必须在写程序时就声明数组长度,而动态联编在运行时才确定数组的长度。
int arr[5];
用new创建动态数组:
double *p3 = new double[3];
上述代码使得声明一个长为3,类型为double的动态数组。
delete动态数组:
delete p3[];
使用new和delete时应遵守的规则:

声明完动态数组,我们可以通过下面的方式进行初始化:
- int *p1=new int[10]; //10个未初始化的int
- int *p2=new int[10](); //10个初始化为0的int
- string *p3=new string[10]; //10个空的string
- string *p4=new string[10]();//10个空的string
- int *p1=new int[5]{0,1,2,3,4};
- string *p3=new string[3]{"a","the",string(3,'x')};
并且动态分配一个空数组是合法的!
- int arr[0]; //错误
- int *p = new int[0]; //正确
动态数组的访问:
我们创建了一个动态数组指针p3后,我们可以通过p3[i]来直接访问数组中的第i个元素。请注意!这与我们一般使用*(p3 + i)来访问不同!

![]()
可以看到,上述代码将指针p3当作数组名使用 。

参考资料: