一口气吃下数组的存储方式

Long long ago,我们讲到了数组《聊一聊数组背后的那点事》,这个已经是迈进指针的第一步了,主要的内容是一维数组,今天我们将讲述二维数组。当结束了今天的内容之后就会开启指针部分的内容。指针可以说是C语言的灵魂啦,如果真的想搞定指针,一定要好好学习本节课的内容,并且好好回顾一下上节课的内容哦~

1

二维数组的定义

定义二维数组的方法跟一位数组相似,使用方括号指定每个维度的元素个数:

其实可以很形象的将二维数组想象成一个平面,如下所示分别对应着 5*5,4*5 和 6*3 大小的二维数组。

但是这只是一种想象,因为实际上二维数组在内存中是以线性的方法进行存储的,如下图为一个 int b[4][5]; 大小的数组在内存中存储示意图

如上图所示,其中的 b[0] 表示 int b[4][5]; 中的第一行中的元素,同理b[1], b[2], b[3] 表示第二行,第三行和第四行中的元素。在上图中的第二行可以看到 b[0] 中具体存储的是第一行中的 5 个元素(b[0][0] 到 b[0][4]),b[1] 里面所储存的就是 b[1][0] 到 b[1][4] 5 个元素。可以看到,我们虽然将数组定义为了二维的形式,但是在内存中仍然是以线性的形式进行存储。

到目前已经讲了一维数组和二维数组在内存中是如何存储的了,那三维数组或者多维数组呢?思考一下,期待在留言中看到你的答案哦~

2

二维数组的初始化

二维数组主要提供了以下几种初始化的方式

由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内,即为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来,即

对于上面代码中的两种方式,我们更推荐第二种方式。因为第二种方式更加直接,虽然占用空间变大了,但是也更容易被理解。

二维数组也可以仅对部分元素赋初值上面的这段代码将对数组中第每一行的第一个元素进行赋值,其余的部分将自动补零。

如果希望整个二维数组初始化为0,那么直接在大括号里写一个0即可:C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:二维数组的初始化也能偷懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须写上:2

二维数组的访问

二维数组的访问的具体方式如下

跟访问一维数组相似,同样是使用下标访问数组中的元素。同样需要注意下标的取值范围,以防止数组的越界访问。比如 int a[3][4],其“行下标”的取值范围是 0~2,“列下标”的取值范围是 0~3,超出任何一个下标的访问都会造成越界。

今天的内容就先到这里啦,接下来的文章很多都是烧脑文章哦,什么指向指针的指针,数组指针与指针数组的区别,数组名和指针……各种奇奇怪怪像绕口令一样的问题会接踵而至,我准备好了,你呢~

3

参考

[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P20