我们之前已经了解过了一维数组,今天我们要介绍的是二维数组,二维数组相对于一维数组比较难理解一些。这个二维数组就是一种有行和列概念的数组,你可以把二维数组堪称是一维数组的延申,因为从内存的角度来看,他们是一样的。但是由于有了行和列的概念,在处理起一些问题来,更加方便。

二维数组的定义

声明方式:
类型说明符 数组名[常量表达式1][常量表达式2];
例如:
int temp[3][4];
二维数组也可以看作多个一维数组,它的每一个元素又是一个一维数组。

二维数组的初始化

二维数组和一维数组一样,也可以在声明时对其进行初始化,二维数组的初始化方式比一维数组复杂,但是都是由一维数组初始化的方式衍生而来。

  1. 分行给二维数组赋初值
int arrTem[2][3] = {{1,2,3},{4,5,6}};
//使用大括号分别把每行标记出来
  1. 可以将所有数据写在一个括号内,按数组的排列顺序对各元素赋初值。
int arrTem[2][3] = {1,2,3,4,5,6};
//这种情况会按照你给初始值的个数来进行分配,这里和上面那个分配结果一样
  1. 可以对部分元素赋初值
int arrTem[2][3] = {{1},{2,3,4}};    //分行赋值
int arrTem2[2][3] = {1,2,3};    //整体赋值

注:这两种方式虽然都是给部分赋值,但是还是有区别的
分行方式:至少每一行都有值不足的补0;
整体方式:将第一行赋值完之后,在赋值接下来的部分,有可能只对第一行部分进行了赋值,其他都为0。

  1. 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对一维数组长度可以不指定,但第二维的长度不能省。
    例如:
int arrTem[][5] = {1,2,3,4,5,6,7,8,9,0};

数组会自动根据元素实际的个数去开辟空间。
一共有9个元素,每一行可以容纳5个元素,那么可以确定有两行
第一行:1,2,3,4,5
第二行:6,7,8,9,0
在第二行不足的地方补了0

省略二维的长度的情况:

int arrTem[2][] = {1,2,3,4,5,6};    //这种是错误的

因为我么只知道有两行数据,但是每一行有多少个元素不确定,每一行的元素个数可能时无限大,无法进行分配。

二维数组的应用

二维数组元素的使用方式和一维数组类似:
数组名[下标][下标]

  1. 下标可以是普通的数值
int Arry1[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
printf("%d\n",Arry1[0][0]);//打印第一行的第一个元素:1
printf("%d\n",Arry1[0][1]);//打印第一行的第二个元素:2
printf("%d\n",Arry1[1][0]);//打印第二行的第一个元素:6
  1. 下标可以是整数表达式
arrTem[2-1][2*2-1];//无论是什么表达式,只要满足结果大于等于0即可
  1. 下标可以是变量(除了定义的时候)
//二维数组的遍历
for(int i = 0;i<4;i++)
{
    for(int j = 0;j<10;j++)
    {
        printf("%d ",Arry2[i][j]);
    }
}
  1. 数组元素在使用的时候和普通变量一样,可以出现在表达式中,也可以被赋值
arrTem[1][2] = arrTem[2][3]/2;
//是将该下标中的元素值进行除2,然后再赋值给后面的元素

注:下标都是从0开始的,因该在已定义的数组大小的范围内。常出现的错误是:

int a[3][4];
a[3][4] = 3;
//数组中没有该下标的元素。下标是从0开始的。

说明

  1. 二维数组可以被看做是一种特殊的一维数组:它的元素又是一个一维数组。
  2. 二维数组中元素排列时按行存放的。即在内存中先按顺序存放完第一行的元素后,再放第二行元素。
最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏