本章内容需要根据代码详细理解!!!
最先理解:多维数组就是数组的数组
int ia[3][4];//两个维度的数组!!!这个数组大小为三,每一个元素是大小为四的整形数组
int arr[10][20][30];//三个维度的数组
!!!维度可以无限,定义一个数组,它的元素是数组,下一级的元素还是数组,以此类推
对于二维数组,常把第一个维度称为行,第二个维度称为列。
可以以行列的方式看待二维数组,ia[3][4]若初始化后这样看。每一行就是一个元素为4的数组,即
{{0,1,2,3},{4,5,6,7},{8,9,10,11}}
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
1.每一行用花括号初始化
int ia[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
2.不标识花括号初始化(初始每一个元素)
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
3.仅初始化每行的第一个元素
int ia[3][4]={{0},{4},{8}};
这样初始化后为
0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 |
8 | 0 | 0 | 0 |
未显式初始化的元素默认为0
4.若在3的基础上省去花括号初始化
int ix[3][4]={0.3,6,9};
则只有第一行显式初始化,其余为0
若下标运算符个数和维度一样多,则表示元素
ia[2][3]=arr[0][0][0];
之前的定义,ia是二维,arr是三维,两者均表示元素
若下标运算符个数比维度小,则表示结果是给定索引处的一个内层数组
int (&row)[4]=ai[1]
ai[1]是一行,一个含有四个整型元素的数组,本句意思是将其绑定到row上
注意row的写法!!!之后操作row就相当于操作{4,5,6,7}
对于二维数组,常使用两层循环嵌套
for(int i=0;i<3;i++)//或i!=3
{
for(int j=0;j<4;j++)//或j!=4
{
//对元素的操作
}
}
i用来控制行
j用来控制列
范围for写操作
int c=0;
for(auto &row:ia)
{
for(auto &col:row)
{
col=c;
c++;
}
}
引用&用来改变值
思考row不用auto来写是什么类型,在练习中解答
范围for读操作
for(auto &row:ia)
{
for(auto col:row)
{
cout<
要点: 仍为 auto &row,避免数组被自动转为指针。若不加&,则 auto row:ia ia是数组名,是指针,会将row转为指针,而不会自动识别为数组(P105,decltype不会有这种情况).若row是指针,则内层循环就要在指针中遍历,明显有问题
用范围for遍历多维数组时,除了最内层的循环,其他的循环控制变量都应为引用类型
按照一维数组理解,一维数组数组名是第一个元素的地址。多维数组是数组的数组,所以数组名是指向第一个内层数组的指针
int ia[3][4];
int (*p)[4]=ia;
p为指向数组的指针(数组为大小为4的整型数组)
p=&ia[2];
p指向第2行(从0开始),p是指针,赋值要用地址(&)赋值
区分:
int *ip[4]; ip是数组,大小为4,元素是整型指针 ip是装有四个整型指针的数组
int (*ip)[4]; ip是指针,指向一个大小为4的整型数组
可用 auto,decltype避免繁琐的类型判断
用for遍历二维数组
for(auto p=ia;p!=ia+3;p++)
{
for(auto q=*p;q!=*p+4;q++)
{
cout<<*q;
}
cout<
起别名有两种方式(P60)
using int_array=int[4];
int_array是int[4]的别名
typedef int int_array[4];
给一个大小为4的int数组,起别名为int_array。typedef int a; int的别名是a
for(int_array p=ia;p!=ia+3;p++)
{
for(int *q=*p;q!=*p+4;q++)
{
cout<<*q;
}
cout<
3.43
for(int (&row)[4]:ia)//int[4] (&row)是错的!
{
for(int col:row)
{
cout<
3.44 用别名 3.45用auto替代即可