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

C++ Primer 3.6 多维数组 知识点+练习题_第1张图片

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

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

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处理多维数组

 范围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替代即可

你可能感兴趣的:(c++,开发语言)