C语言学习(十四)---二维数组

文章介绍了二维数组的概念,作为一维数组的扩展,强调了二维数组的定义方式,包括指定行数和列数,并通过实例说明了初始化的规则,如需按行列顺序填充。同时,文章探讨了二维数组在内存中的存储方式,通过打印地址证明了其连续存放的特点。此外,还讨论了初始化时可以不确定行数但必须确定列数的情况。
摘要由CSDN通过智能技术生成

上节我们学习一维数组的定义,使用方式、注意事项等等,既然一维数组学完了,那我们今天就再学习比一维数组再高一维的数组,也即二维数组,话不多说,开整!!!

二维数组

定义方式

我们知道一维数组的定义方式为:

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位机器),所以说:

二维数组的存放方式仍为顺序存放

,如下图所示:
在这里插入图片描述
只不过是我们在理解上其为下图所示,以此来和一维数组进行区分(我的理解是这样的)
在这里插入图片描述
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器 xiaohu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值