C++ Primer 3.6 多维数组 知识点+练习题

本章内容需要根据代码详细理解!!!

最先理解:多维数组就是数组的数组

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}}

0123
4567
891011

多维数组初始化

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}};

这样初始化后为

0000
4000
8000

未显式初始化的元素默认为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处理多维数组

 范围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<<col<<endl;
    }
}
即使是读操作 仍然是auto &row!!!

要点: 仍为 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<<endl;
}

!!!p是指针,*为取值,将地址中的值取出来,取出来的值为一维数组,数组名还是指针,所以q也是指针
!!!p遍历行,q遍历行中每一列(元素)

可使用标准库(注意参数,end返回值)
for(auto p=begin(ia);p!=end(ia);p++)
{
    for(auto q=begin(*p);q!=end(*p);q++)
    {
          cout<<*q;
    }
    cout<<endl;
}

类型别名简化多维数组指针

起别名有两种方式(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<<endl;
}

练习题

3.43

for(int (&row)[4]:ia)//int[4] (&row)是错的!
{
    for(int col:row)
    {
        cout<<col<<endl;
    }
}

for(int (*p)[4]=ia;p!=ia+3;p++)
{
    for(int *q=*p;q!=*p+4;q++)
    {
        cout<<*q<<endl;
    }
}

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

3.44 用别名 3.45用auto替代即可

  • 32
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值