数组的大小确定不变,不能随意向数组中添加元素。

如果不清楚元素的确切个数,使用vector

定义和初始化

数组的声明形如 a[d],其中a是数组的名字,d是数组的维度,其中数组的维度d必须常量表达式

1
2
3
4
5
6
unsigned cnt = 42;              // 不是常量表达式
constexpr unsigned sz = 42; // 常量表达式,关于constexpr
int arr[10]; // 含有10个整数的数组
int *parr[sz]; // 含有42个整型指针的数组
string bad[cnt]; // 错误:cnt不是常量表达式
string strs[get_size()]; // 当get_size是constexpr时正确;否则错误

不允许拷贝和赋值

不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值

1
2
3
int a[] = {0, 1, 2};    
int a2[] = a; // 错误
a2 = a; // 错误

一些编译器支持数组的赋值,这就是所谓的编译器拓展。

复杂数组的声明

要理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读

1
2
3
4
int *ptrs[10];              // ptrs是含有10个整型指针的数组
int &refs[10] = /* ? */; // 错误,不存在引用的数组
int (*Parray)[10] = &arr; // Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr; // arrRef引用一个含有10个整数的数组

访问数组元素

与标准库类型vector与string一样。

指针与数组

1
2
3
string nums[] = {"one", "two", "three"};
string *p = &nums[0]; // p指向num的第一个元素
string *p2 = nums; // 如上

标准库函数begin和end

1
2
3
int ia[] = {0, 1, 2, 3, 4};
int *beg = begin(ia); // 指向ia首元素的指针
int *last = end(ia); // 指向ia尾元素的下一个位置的指针

解引用和指针运算的交互

1
2
3
int ia[] = {0, 2, 4, 6, 8};
int last = *(ia + 4); // 把last初始化成8,也就是ia[4]的值;
last = *ia + 4; // 等价于last = ia[0] + 4;

使用数组初始化vector对象

1
2
int int_arr[] = {0, 1, 2, 3, 4, 5};
vector<int> ivec(begin(int_arr), end(int_arr));