严格来说,C++语言不存在多维数组,通常所说的多维数组其实是数组的数组。
当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,一个维度表示其元素(也是数组)
大小。
对于二维数组来说,常把第一个维度称作行,第二个维度称作列。

多维数组的初始化:

允许使用花括号括起来的一组值初始化多维数组:

int a[2][2]={{1,2}{3,4}};

其中内层嵌套着的花括号并非必需的。

int b[2][2]={5,6,7,8};	//	效果与上面的一样

如果其中有列出的元素,那么将执行默认值初始化。

可以使用下标运算来访问多维数组的元素,此时数组的每个维度对应一个下标运算。

如果表达式含有的下标运算符的数量和数组的维度一样多,该表达式的结果将是给定类型的元素;反之,如果表达式含有的下标运算符数量比数组的维度小,则表达式的结果将是给定索引处的一个内层数组。

用for循环处理多维数组

普通的for循环:

for(int i=0;i!=2i++){
  for(int i=0;j!=2;j++){
	cout<<a[i][j]<<endl;
 }
}

范围for循环:

for(auto &row:a){
 for(auto col:row){
	cout<<col<<endl;
 }
}

将外层循环的控制变量声明成了引用类型,这是为了避免数组被自动转成指针。使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针。定义指向多维数组的指针时,千万别忘了这个多维数组实际上是数组的数组。所以有多维数组名转换得来的指针实际上是指向第一个内层数组的指针。

通过auto和decltype就能尽可能地避免在数组前面加上一个指针类型了:

int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
for (auto p=a; p != a + 3; p++) {
	for (auto q =*p; q !=*p + 4; q++) {
			cout << *q << endl;
		}
	}

使用类型别名可以简化多维数组的指针:

int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	using ia = int[4];
	for (ia *p=a; p != a + 3; p++) {
		for (int *q =*p; q!=*p + 4; q++) {
			cout << *q << endl;
		}
	}