1 说在前面的话

继续前行、不断攻坚克难!


前面几节课,我们讲了一维数组,并把一维数组中的字符数组拿出来深入讲解!


这节课开始,我们要开始讲解二维数组,二维数组有哪些需要掌握的知识呢,让我们一起走进今天的内容吧!

2 问题引入

某个班级有三排学生,每一排有五名同学。现在要为每个同学分配一个座位号,我们可以怎么做呢?


我们前面讲过一维数组,可以使用一维数组来存这15位同学的座位号:


#include<iostream>
using namespace std;
int main(){
  int a[15];
  for(int i=0;i<15;i++){
    cin>>a[i];
  } 
  return 0;
}


但是如果我们想要知道某一排,某一列同学的学号怎么办呢?


这就需要我们今天要讲的二维数组啦!

3 二维数组

二维数组与一维数组类似,在这一节,我们一起来学一下二维数组的基本概念,让我们一起走进二维数组的世界吧!


1 二维数组定义

在定义二维数组的时候,我们需要数组的类型数组名,以及二维数组的索引


例如:声明一个存储15个学生学号为a的二维数组。


C++强化 | 07 二维数组_c++


我们前面的一维数组,大家可以看做是一排,二维数组就可以看作是一个方阵了,例如三行五列的二维数组如下:


C++强化 | 07 二维数组_c++_02


2 二维数组赋初值

和一维数组一样,二维数组也可以在定义的时候赋初值。


例如我们给一个两行四列的二维数组赋值如下:


int a[2][4]={{1,2,3,4},{5,6,7,8}};

//也可以写成如下格式:
int a[2][4] ={{1,2,3,4},
          {5,6,7,8}};


内层的大括号,表示的是一行的数据,外层大括号把内层大括号括住,内层有几对大括号,就说明至少有多少行。


为什么是至少呢?假如我们有三行四列的数据,我们使用如下方式赋值:


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


没有赋值的位置都会默认为0;这个时候,数据的行列和定义的大小有关


特别的,如果我们使用如下方式赋值,相当于二维数组的每个位置上的值都为0。


int a[2][4] ={ };


4 二维数组索引

一维数组里面有索引,二维数组里面也有索引,一维数组有一对中括号,那么一维数组只有一个索引,二维数组有两个中括号,则有两个索引。

1 索引与基本操作

二维数组有两个索引,第一个索引我们可以称之为:行索引,第二个索引我们可以称之为:列索引


和一维数组一样,二维数组的索引也都是从0开始。并且,行索引小于第一个中括号中的长度,列索引小于第二个中括号中的长度。如果大于或等于,就会越界


以两行四列的数组为例,数组值和索引对应关系如下:


C++强化 | 07 二维数组_c++_03


数组元素的访问方式如下:


cout<<a[0][0]<<endl// 第一行,第一列的数据
cout<<a[0][1]<<endl// 第一行,第二列的数据
cout<<a[0][2]<<endl// 第一行,第三列的数据
cout<<a[0][3]<<endl// 第一行,第四列的数据
cout<<a[1][0]<<endl// 第二行,第一列的数据
cout<<a[1][1]<<endl// 第二行,第二列的数据
cout<<a[1][2]<<endl// 第二行,第三列的数据
cout<<a[1][3]<<endl// 第二行,第四列的数据


同样的,我们可以利用索引去修改某个位置上的值:


a[0][0] = 5; // 修改第一行第一列的数据


2 二维数组索引与循环

如果我们需要大量修改值或者访问值,还用上面的方式去做,那就太不方便啦!



前面我们讲一维数组使用循环可以访问所有的值,修改所有的值,二维数组也可以,因为我们要针对两个索引进行访问与修改,那么我们就需要用到两个变量。也需要用到循环嵌套


我们首先定义一个二维数组,并赋初值:


int a[3][4];
for(int i = 0;i<3;i++){
  for(int j = 0;j<4;j++){
    cin>>a[i][j];
  }
}


我们可以使用如下的方法,按行依次访问数据:


for(int i = 0;i<3;i++){
  for(int j = 0;j<4;j++){
    cout<<a[i][j]<<'\t';
  }
  cout<<endl;
}


按行依次修改数据(假设数据新值为行+列):


for(int i = 0;i<3;i++){
  for(int j = 0;j<4;j++){
    cout<<a[i][j]<<i+j+2//+2是因为索引要比行列分别少1,一共少了2
  }
}


使用如下方式,按列依次访问数据:


for(int j = 0;j<4;j++){
  for(int i = 0;i<3;i++){
    cout<<a[i][j]<<'\t';
  }
  cout<<endl;
}


总结一下就是:


按行访问数据,就要把行索引作为外层循环,会先不断改变内层列索引,不断访问某一行的数据,直到访问完;


按列访问数据,就要把列索引作为外层循环,会先不断改变内层行索引,不断访问某一列的数据,直到访问完;


5 习题

定义一个名字为name的二维字符串数组,用于存放喜羊羊、懒羊羊等12位同学的姓名,按照座位排列。


12位同学的座位如表格。


C++强化 | 07 二维数组_c++_04


尝试通过键盘输入学生的姓名,之后在屏幕上输出学生的姓名。


示例如下:


C++强化 | 07 二维数组_c++_05