数组时一种类似于标准库类型 vector 的数据结构,但是再性能和灵活的权衡上又与 vector 有所不同。与 vector 相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在位置访问。与 vector 不同的地方是,数组的大小确定后不能变,不能随意向数组中添加元素。因为数组的大小固定,因此对某些特殊的应用来说程序运行时的性能较好,但是相应的也损失了一些灵活性。
定义和初始化内置数组
1 unsigned cnt = 42;//不是常量表达式 2 3 constexpr unsigned sz = 42;//常量表达式 4 5 int a[10];//含有10整数的数组 6 7 int *b[sz];//含有42个整型指针的数组 8 9 string c[cnt];//错误,cnt不是常量表达式 10 11 string d[get_size()];//当constexpr时正确,否则错误
默认情况下,数组的元素被默认初始化。定义在函数体外时默认值为0,在函数体内时默认值为随机值(未定义的值)。
定义数组的时候必须指定数组的类型,不允许用auto关键字由初始值的列表推断类型。另外和 vector 一样,数组的元素应该为对象,因此不存在引用的数组。
显示初始化元素:
1 const unsigned sz = 3; 2 3 int a[sz] = {0, 1, 2};//含有3个元素的数组,元素值分别为0, 1, 2 4 5 int b[] = {0, 1, 2};//含有3个元素的数组,元素值分别为0, 1, 2 6 7 int c[5] = {0, 1, 2};//等价于 c[5] = {0, 1, 2, 0, 0} 8 9 string d[3] = {"hello", "world"};//等价于d[3] = {"hello", "world", ""} 10 11 int e[2] = {0, 1, 2};//错误,初始值过多
可以发现,当初始值的数目多于数组大小时,会编译错误,当初始值的数目小于数组大小时,初始值会赋给靠前的元素,剩下的元素被初始化为默认值(一般为0)。
字符数组:
字符数组有一种额外的初始化形式,可以用字符串字面值对此类数组初始化。当使用这种方式时,一定要注意字符串字面值的结尾处还有一个空字符,这个空字符也会像字符串的其他字符一样拷贝到字符数组中去。
1 char a[] = {'c', '+', '+'};//列表初始化,没有空字符 2 3 char b[] = {'c', '+', '+', '