数组
数组是存放类型相同的对象的容器。这些对象本身没有名字,需要通过其所在位置访问。数组的大小确定不变,不能随意向数组中添加元素。
数组是一种复合类型,声明型如a[d],a为数组名,b为数组维度(说明数组中元素的个数)。
数组初始化
默认情况下,数组的元素被默认初始化。在函数内部定义了某种内置类型的数组,那么默认初始化令数组含有未定义的值。在函数体外部定义了某种内置类型的数组,那么默认初始化令数组含有值为0。
显式初始化数组元素
const unsigned sz = 3; int ia1[sz] = {0, 1, 2}; // sz为常量 int a2[] = {0, 1, 2}; // 数组纬度可以为空。根据数组初始值的个数在编译期间确定数组维度 int a3[5] = {0, 1, 2}; // 等价于a3[] = {0, 1, 2, 0, 0}; string a4[3] = {"Hi", "bye"}; // 等价于a4[] = {"Hi", "bye", ""}; int a5[2] = {0, 1, 2}; // 错误,初始值超过了数组的维度
字符数组的特殊性
当用字符串字面值对字符数组进行初始化时,一定要注意字符串字面值的结尾处还有一个空字符,这个字符会像字符串的其他自负一样被拷贝到字符数组中。
char a1[] = {‘C‘, ‘+‘, ‘+‘}; // 列表初始化,没有空字符 char a2[] = {‘C‘, ‘+‘, ‘+‘, ‘\0‘}; // 显式空字符 char a3[] = "C++"; // 自动添加表示字符串结尾的空字符 const char a4[6] = "Daniel"; // 错误。因为字符串字面值末尾包含空字符,导致数组空间不够
复杂的数组声明(难点)
int *ptrs[10]; // ptrs是含有10个整型指针的数组 int (*Parray)[10] = &arr; // Parray指向一个含有10个整数的数组 int (&arrRef)[10] = arr; // arrRef引用一个含有10个整数的数组 int *(&arry)[10] = ptrs; // arry是数组的引用,该数组含有10个指针
指针与数组