严格来说C++没有多维数组,多维数组就是数组的数组
int ia[3][4];//大小为3的数组,每个元素是含有4个整数的数组
int arr[10][20][30] ={0}
//大小为10的数组,每个元素是大小为20的数组,这些数组的元素是含有为30个整形的数组,所有元素初始化为0
对于二维数组来说,常把第一个维度称作行,第二个维度称作列
多维数组的初始化
int ia[3][4] = {
{0,1,2,3} //第一行的初始值
{4,5,6,7} //第二行的初始值
{8,9,10,11} //第三行的初始值
}
int ia[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11} //和上面等价
//显示的初始化每行的首元素
int ia[3][4] = {{0},{3},{4}};
//显示初始化第一行,其他元素执行初始化
int ia[3][4] = {0,3,6,9};
多维数组的下标引用
访问时,每个数组对应一个下标运算符
下标运算符和数组维度一样多,该表达式的结果将是给定类型的元素
比数组维度小,表达式结果将是给定索引的一个内层函数
//用arr的首元素为ia的最后一样的最后一个元素赋值
ia[2][3] = arr[0][0][0];
int (&row) [4] = ia[1]
//把row绑定到ia的第二个四元素数组上 (前面有)
把row定义成了含有4个整数的数组的引用
使用范围for语句处理多维数组
size_t cnt = 0;
for (auto &row : ia) //对于外层数组的每一个元素
for(auto &col :row){ // 对于内层数组的每个元素
col =cnt;
++cnt;
}
如果不用引用类型
for(auto row:ia)
for(auto col :row)
程序将无法通过
编译器初始化row的时候会自动将这些数组形式的元素转换成指向该数组内首元素的指针,row的类型就是int*
Note:使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型
指针和多维数组
当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针
Note:定义指向多维数组的指针是,千万别忘了这个多维数组实际上是数组的数组
int ia[3][4];
int (*p)[4] = ia; //p指向含有4个整数的数组
p = &ia[2] //p指向a的为元素
Note:上述声明中,圆括号必不可少
int *ip[4]; // 整形指针的数组
int (*ip)[4]; // 指向含有4个整数的数组
通过使用auto或者decltype就能尽可能避免在数组前面加上一个指针类型了
//输出ia中每个元素的值,每个内层数组各占一行
//p指向含有4个整数的数组
for(auto p = ia; p != ia+3; ++p){
// q指向4个整数数组的首元素,也就是说,q指向一个整数
for(auto q = *p; q != *p+4;++q)
cout << *q << ' ';
cout <<endl;
}
用标准库的begin和end能看起来更加简洁
for(auto p = begin(ia);p != end(ia);++p)
类型别名简化多维数组的指针
using int_array = int[4];
typedef int int_array[4]; //等价的typedef
程序将类型 “4个整数组成的数组”命名为int_array ,用int_array定义外层循环变得简洁明了
for (int_array * p = ia; p!= ia+3; ++p)
正常写法 int (*p)[4] = ia;