静态数组与动态数组的区别

静态数组 在编译时必须知道其长度即需用常量表达式指定数组长度,数组只在定义它的块语句内存在。

动态数组在运行时动态地分配数组。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度。与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止。

动态数组的初始化:

string *psa = new string[10]; // array of 10 empty strings
int *pia = new int[10]; // array of 10 uninitialized ints

动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化,没有默认构造函数的类类型不能成为动态数组的元素;如果数组元素是内置类型,则无初始化。

也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化:

int *pia2 = new int[10] (); 圆括号要求编译器对数组做值初始化,数组元素都将为0.

值得注意的是:允许动态分配空数组:char *cp = new char[0]; // 没有问题,new返回有效的非0指针,因为cp没有指向任何元素,故不能解引用。cp允许的操作包括:比较运算,因此该指针能在循环中使用;允许在该指针上加(减)
0得到本身;或者减去本身,得 0 值。

size_t n = get_size();
int* p = new int[n];
for (int* q = p; q != p + n; ++q)  //如果n=0;则上一步ok,没问题,循环第一次判断失败不会执行循环体。
/* process the array */ ;

但是c++不允许      char arr[0];  //errror

你可能感兴趣的:(c++)