和vector一样,数组能存放大多数类型的对象。
int *ptrs[10]; //ptrs是含有10个整型指针的数组
int &refs[10] = /* ? */; //错误:不存在引用的数组
int (*Parray)[10] = &arr; //Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr; //arrRef引用一个含有10个整数的数组
对修饰符的数量并没有特殊限制:
int *(&arry)[10] = ptrs; // arry是数组的引用,该数组含有10个指针
首先知道arry是一个引用,如何观察右边,arry引用的对象是一个大小为10的数组,最后观察左边知道,数组的元素类型是指向int的指针,这样arry就是一个含有10个int型指针的数组的引用。
访问数组元素:
在使用数组下标的时候,通常将定义为size_t类型。在cstddef头文件中定义了size_t类型,这个文件是C标准库stddef.h头文件的C++版。
数组除大小固定外,其他用法与vector基本类型。可以用数组来记录各分数段的成绩个数。
unsigned scores[11] = {};
unsigned grade;
while (cin>>grade){
if(grade <= 100)
++scores[grade/10];
}
多维数组
程序中经常会用到两层嵌套的for循环来处理多维数组的元素:
constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt];
for(size_t i = 0; i!=rowCnt; ++i){
for(size_t j = 0; j!=colCnt; ++j){
ia[i][j] = i * colCnt + j;
}
}
外层for循环遍历ia的所有元素,内存for循环则遍历那些一维数组的整数元素。
范围for(增强for)处理多维数组:
size_t cnt = 0;
for(auto &row : ia)
for(auto &col : row) {
col = cnt;
++cnt;
}
}
之所以要选用引用类型作为循环控制变量,除了可以改变数组元素的值之外,还有一个更深层次的原因:避免数组被自动转成指针。
for (const auto &row : ia) // 对于外层数组的每一个元素
for (auto col : row) // 对于内层数组的每一个元素
cout << col << endl;
对于范围for循环来说,除了最内层的循环以外,其他所有循环的控制变量都应该是引用类型。