二维数组 和 变长数组

在上一期的内容中,为诸君讲解到了一维数组,在一维数组的基础上,C语言中还有着多维数组,其中,比较典型且运用较为广泛的就是我们今天的主角——二维数组

一 . 二维数组的概念

我们把单个或者多个元素组成的数组定义为一维数组。由此推演,我们可得:一维数组作为数组的元素,这就是我们的二维数组;把二维数组作为数组的元素,这就是我们的三维数组......

二维数组以上的数组我们就将其称为多维数组

二 . 二维数组的创建

二维数组相较于一维数组,在表达形式上其实没有太大的变化,多了一个括号而已嘛,其实质也就是多了一个纵列,话不多说,咱们直接上图理解:

三 . 二维数组的初始化

初始化这个概念,跟诸君都是老朋友了昂,我们每当介绍到一个变量的时候,都会讲到其初始化,所以,二维数组也不例外,二维数组的初始化格式跟一维数组相差无几,只是略有差异而已

(1)二维数组的完全初始化

关于二维数组可以省略“ 行 ”但不能省略“ 列 ”:诸君都是聪明人,大家在脑袋里面推演一下就能相同了,当我们拿到一串数字,虽然我们不知道它有几行,但我们知道了“ 列 ”数,我们自然是可以大致的将二维数组的表格罗列出来;但我们只知道“ 行 ”,不知道“ 列 ”却办不到

这种完全初始化的二维数组在其内部的表现形式为:

(2)二维数组的不完全初始化

这两个二维数组在其内部的表现形式为:

(3)按照“ 行 ”初始化

 这种按照“ 行 ”初始化的二维数组在其内部的表现形式为:

四 . 二维数组的下标

二维数组跟一维数组的下标格式一样,如上图所示,仅仅只是多了个纵列而已,由上至下从0开始的递增变化,大家可以简单地将其理解为我们数学当中的坐标,只是这个特殊的坐标是从左上角开始,数值是由0开始

如上图,当我们想要找到三行二列的存放的数时,我们只需要输出 arr [2] [1] 即可,当然,由于这是一个整形数组,我们存放的也是整数,所以我们依旧用“ %d ”打印,如:

五 . 二维数组的输入与输出

这几个字看似陌生,其实都是天天打交道的老朋友啦,你不信?那我就来为诸君逐字分析:

提到输入,诸君是不是应该第一时间想到 scanf 函数

提到输出,诸君是不是应该第一时间想到 printf 函数

这就只剩下了我们的二维数组了,且我们的二维数组是不是有多个元素?这就需要我们去“ 遍历 ”的输入与输出,遍历这个词儿大家能get到吧?大家可以理解为通过循环的方式一个一个去接触,所以我们会选择用 for 循环去遍历输入与输出每个元素

这样子看来,二维数组的输入与输出是不是诸君最熟悉的陌生人呢?

那么话不多说,咱们就直接上图了昂:

六 . 二维数组在内存中的储存

大声的告诉我,我们想要探究一个东西在计算机的内存中的储存方式,我们该怎么做?

打印地址嘛,地址一打印出来,一瞧,这不比看干巴巴的文字有用,上图!

(1)这是x64环境下,也就是64位

(2)这是x86环境下,也就是32位

之前提到过,计算机中地址都是以十六进制数储存的

所以由此观之:不管是在x64还是在x86环境下,只要是整型,每个地址之间都相差4个字节。且我们也可以得出,二维数组中的每个元素也是连续存放

七 . 变长数组

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式。这样的语法限制呢,就让人在写代码的时候很不方便,使得我们创建数组不够灵活,数组大了浪费空间,数组小了又会越界,造成bug,很不爽对吧

当然了,这些小问题,诸君不必多虑昂,有限制就必定有突破嘛,在C99当中就改革创新了,给了我们一个变长数组(variable-length array,简称 VLA)的新特性,这就使得我们可以运用变量来创建数组,如下图所示的形式:

变长数组的长度取决于变量 “ n ”的值,编译器没办法事先预知,只有当我们的程序在运行时,才能知道这个“ n ”是多少,我们才能确定数组长度。因此,变长数组是不能初始化的。这个点应该很好理解昂,大家想一想嘛,初始化不就是为了给数组提供元素数据嘛,你这一输入,数组里的长度不就定死了嘛,那还咋变长啊是吧

它的好处是:程序员不必在开发时,随意为数组指定一个估计的长度, 程序会在运行时为数组分配
精确的长度
但它有一个比较迷惑的点:变长数组的意思是 数组的大小是可以使用变量来指定的,在程序运行的
时候,根据变量的大小来指定数组的元素个数 ,而不是说数组的大小是可变的。 数组的大小一旦确
定就不能再变化了(天王老子来了不行!)

但是呢,很遗憾昂,在我们使用的VS2022版本上,虽然支持绝大部分的C99语法,但恰巧就没有

这个变长数组。当然,有gcc编译器的小伙伴们可以去试一试,我就不试了,我只有VS2022,大

家了解到这个变长数组的概念就好 

OKK,有关数组的知识点这是这两期的内容了,一维数组、二维数组、变长数组等等。数组的内容还是很重要的,因为它跟我们C语言中的一大拦路虎——指针,也就是我们俗称的“ 地址 ”息息相关,所以还望诸君一定引起重视。鄙人这两天就被指针搞得焦头烂额,唉,难搞哟,革命尚未成功,同志仍需努力!多的不唠了,加油加油,咱们也下期再见,与诸君共勉!!! 

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值