在上一期的内容中,为诸君讲解到了一维数组,在一维数组的基础上,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语言中的一大拦路虎——指针,也就是我们俗称的“ 地址 ”息息相关,所以还望诸君一定引起重视。鄙人这两天就被指针搞得焦头烂额,唉,难搞哟,革命尚未成功,同志仍需努力!多的不唠了,加油加油,咱们也下期再见,与诸君共勉!!!