1. 数组
与vector相比,数组大小是确定的,不能随意增加元素
定义和初始化内置数组
数组声明时,数组的元素个数是已知的,在编译阶段就得知道,即维度必须是常量表达式
如果在函数内部定义了某种内置类型的数组,那么默认初始化会令数组含有未定义的值
字符数组的特殊性:
字符数组可以用字符串字面值对数组进行初始化(一定得注意结尾处有一个空字符)
char a[] = "C++"; //自动添加空字符
const char a2[6] = "hello!"; //错误,没有空间存放空字符
数组不允许拷贝和赋值
int a[] = {1, 3, 4};
int a2[] = a; //错误
a2 = a; //错误
数组的指针和数组的引用
int arr[] = { 1,2,3 };
int(*parray)[3] = &arr; //parray指向一个含有三个数组的指针
cout << typeid(parray).name() << endl; //输出 int (* __ptr64)[3]
int(&arrRef)[3] = arr;
cout << typeid(arrRef).name() << endl; //输出int [3]
2. 指针和数组
对数组使用取地址符获得指向该元素的指针:
int a[] = {1,3,4};
int *p = &a[0]; //p指向a的第一个元素
//用到数组名字的地方,编译器自动将其转化为指向数组首元素的地址
int *p2 = a; //以上两种方式等价
标准库函数begin和end
int a[] = {1,2,4};
int *beg = begin(a); //指向数组首元素的指针
int *last = end(a); //指向数组尾元素下一个位置的指针;
使用数组初始化vector对象:
int arr[] = {1,2,3};
vector<int> vec(begin(arr), end(arr)); //整个数组初始化
vector<int> vec2(arr, arr + 3) //使用三个元素进行初始化
3. 多维数组
for循环处理多维数组
for (const auto &row : a)
for (auto col : row)
cout << col << endl;
为什么要加引用呢? 如果不加引用:
for (auto row : a)
for (auto col : row)
cout << col << endl;
程序会报错,无法通过编译。这是因为如果row不是引用类型,编译器初始化会将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的**row类型就是int ***,内层循环不合法。
C++11新标准使用auto避免数组前面加上指针类型:
int arr[3][4] = {1,2,3};
for (auto p = arr; p != arr + 3; p++) {
for (auto q = *p; q != *p + 4; q++) {
cout << *q << ' ';
cout << typeid(q).name() << endl;
}
cout << endl;
}
p实际上表示一个指向大小为4的数组的指针;数组名被自动转换为该数组首元素的指针