严格来说,C++语言中没有多维数组,多维数组其实是数组的数组。
1.多维数组的初始化
正如我们所说的,多维数组其实是数组的数组,那么就可以理解成,一个元素数量为m的数组,它的元素为元素数量为n的数组。那么可以显式地初始化它。
int array[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
这个数组的定义和下面数组的定义是等价的。
int array[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
由此我们可以看出来,如果我们没有用大括号来划分的话,那么编译器按照每四个为一组数组的方式进行初始化。
int array1[3][4] = {{1}, {2}, {3}};
// 这个数组的意思是第一个元素(也就是第一个数组)的第一个元素为1, 其余被默认初始化为0,第二个
// 元素和第三个元素同理。
int array2[3][4] = {1, 2, 3, 4};
// 这个又是什么意思呢?该数组的第一个元素(也就是第一个数组)被初始化为{1, 2, 3, 4},其余
// 的被初始化为0
2.多维数组的引用。
直接上代码吧。
int &rarray = array; // 引用array数组
int (&rarray)[4] = array[1]; // rarray引用的是array中的第二个元素(即第二个数组)
3.使用范围for语句处理多维数组
int a = 0;
for(auto &row : array) // 外层数组
{
for(auto &cow : row) // 内层数组
cow = a++;
}
先循环第一个数组得到作为其元素的每一个数组,再对每一个作为外层数组元素的数组遍历,访问每一个元素。总之,还是那句话:多维数组是数组的数组。二维是数组的数组,三维是数组的数组的数组......
4.指针和多维数组
有时候我们希望指向外层数组中的内层数组,那么这该怎么操作呢?
其实和引用的方法差不多。
int array[3][4]; // 默认初始化为0
int (*parray)[4]; // 指向含有四个整数的数组
parray = &array[2] // 指向array的尾元素
注意:*parray 和[4]必须用括号隔开,int *parray[4]表示的是含有四个指向整数的指针的数组