数组
定义和初始化内置数组
显式初始化数组元素
如果维度比提供的初始值数量大,则用提供的初始值初始化靠前的元素,剩下的元素被初始化为默认值。
const unsigned sz = 3; // 维度必须是一个常量表达式
int ia1[sz] = {0, 1, 2}; // 含有三个元素的数组,元素值为0,1,2
int a2[] = {0, 1, 2}; // 纬度为3的数组
int a3[5] = {0, 1, 2}; // 等价于a3[] = {0, 1, 2, 0, 0}
string a4[3] = {"hi", "bye"}; // 等价于a4[] = {"hi", "bye", ""}
不允许拷贝与赋值
不能将数组的内容拷贝给其他数组作为其初始值,也不能为其他数组赋值:
int a[] = {0, 1, 2};
int a2[] = a; // 错误:不允许使用一个数组初始化另一个数组
a2 = a; // 错误:不能把一个数组直接赋值给另一个数组
指针与数组
在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
string nums[] = {"one", "two", "three"};
string *p = &nums[0]; // p指向nums的第一个元素
string *p2 = nums; // 等价于p2 = &nums[0]
下标与指针
标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求,内置的下标运算符可以处理负值。
int *p = &ia[2];
int j = p[1]; // 等价于ia[3]
int k = p[-2]; // 等价于ia[0]
C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应当尽量使用string,避免使用C风格的基于数组的字符串。
多维数组
C++中没有多维数组,通常所说的多维数组其实是数组的数组。
多维数组初始化
int ia[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}
};
指针与多维数组
int *ip[4]; // 整型指针的数组
int (*ip)[4]; // 指向含有4个整数的数组