上节我们学习一维数组
的定义,使用方式、注意事项等等,既然一维数组
学完了,那我们今天就再学习比一维数组
再高一维的数组,也即二维数组
,话不多说,开整!!!
二维数组
定义方式
我们知道一维数组的定义方式为:
int arr[10] = {0};
并且其存放的方式为在内存中顺序存放
,这个一维数组相当于一行
,那么二维数组只是比它多了一个列
而已,因此二维数组
的定义方式为:
- 首先声明数组类型,比如int整型
- 然后定义数组的大小,几行几列,
然后对数组进行初始化
,同一行
的内容由{}
包含,不同列
之间由,
分隔
如下所示,定义了一个3X4也即3行4列的数组,
int arr[3][4] = {{0,1,2},{4,5,6},{7,8,9}};
注意:
二位数组的行或列的起始标号仍为0
我们可以查看定义的数组内容,在vscode中左侧的监视窗口输入arr变量,如下:
然后进入调试模式,点击右上角的bug
标志,如下,然后每一步的调试按F10
即可:
通过监视窗口,我们可以看到各行各列的内同如下:
的确是和我们定义的方式一样,第一行分别存放0 1 2 ,第二行存放4 5 6,第三行存放7 8 9,从这里我们可以开到,我们未进行初始化的位置,仍被默认赋值为0
,因此,
`二维数组同一维数组一样,当未完全初始化时,默认赋值0
在二维数组初始化
时,一定要严格按照上述的第三步进行
,如果在不同的行列之间,我们不采用相应的分隔符进行区分,我们可以查看相应的结果,示例代码如下:
#include<stdio.h>
int main()
{
int arr[3][4] = {{0,1,2},{4,5,6},{7,8,9}};
int arr2[3][4] ={0,1,2,4,5,6,7,8,9};
return 0;
}
我们同样进入调试模式,查看结果:
我么可以看到,和我们想要的结果不同,因此,
当不采用相应的区分行列时,二维数组会顺序填充,
所以,为了避免误会,要对和不同的行列内容之间使用{}和,
进行区分。
二维数组初始化
二维数组的初始化问题,同样可以分为完全初始化
与不完全初始化
两种,此内容同一维数组初始化,不在此处赘述,大家可以自行查看:
一维数组
初始化的注意事项
在一维数组初始化
时,当我们不确定数组的内容的大小时,我们可以不确定数组的大小,然后由计算机根据内容自行创建,那么二维数组初始化是不是也可以这样呢?下面进行验证,如下,我还是要存放和上述内容同样的数据,但是此处不指定二维数组的大小,代码如下:
#include<stdio.h>
int main()
{
int arr[3][4] = {{0,1,2},{4,5,6},{7,8,9}};
int arr2[3][4] ={0,1,2,4,5,6,7,8,9};
int arr3[][] = {{0,1,2},{4,5,6},{7,8,9}};
return 0;
}
编译查看结果,可以看到,无法进行编译
:
提示我们初始化错误,那么是不是二维数组不能这样呢?
我们对代码进行修改,此时我们不省略行
,也即
int arr3[3][] = {{0,1,2},{4,5,6},{7,8,9}};
编译查看结果:
可以看到,仍然无法进行初始化
,那么我们不省略列,省略行
会怎么样呢也即:
int arr3[][4] = {{0,1,2},{4,5,6},{7,8,9}};
编译查看结果:
可以看到此时可以进行初始化,因此:
二维数组在进行初始化时,可以不确定行数,但必须确定列数
二维数组的存储方式
前文提到,一维数组在内存中是顺序存放
的,那么二维数组又是如何存放的呢,下面进行验证,如下示例代码:
#include<stdio.h>
int main()
{
int arr[3][4] = {{0,1,2},{4,5,6},{7,8,9}};
int i = 0;
int j = 0;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("arr[%d][%d] = %p\n",i,j,&arr[i][j]);
}
}
return 0;
}
编译查看结果如下所示:
那么可以看到,相邻的元素直接仍然是相差4个字节
,也即一个整型变量(32位机器),所以说:
二维数组的存放方式仍为顺序存放
,如下图所示:
只不过是我们在理解上其为下图所示,以此来和一维数组进行区分(我的理解是这样的)
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!