本博客主要内容为 “小甲鱼” 视频课程《带你学C带你飞》【第一季】 学习笔记,文章的主题内容均来自该课程,在这里仅作学习交流。在文章中可能出现一些错误或者不准确的地方,如发现请积极指出,十分感谢。
也欢迎大家一起讨论交流,如果你觉得这篇文章对你有所帮助,记得评论、点赞哦 ~(。・∀・)ノ゙
1. 二维数组的定义
定义二维数组的方法跟一位数组相似,使用方括号指定每个维度的元素个数:
类型 数组名[常量表达式][常量表达式]
int a[6][6]; // 6*6,6行6列
char b[4][5]; // 4*5,4行5列
double c[6][3]; // 6*3,6行3列
其实可以很形象的将二维数组想象成一个平面,如下所示分别对应着 66,45 和 6*3 大小的二维数组。
但是这只是一种想象,因为实际上二维数组在内存中是以线性的方法进行存储的,如下图为一个 int b[4][5];
大小的数组在内存中存储示意图
如上图所示,其中的 b[0] 表示 int b[4][5];
中的第一行中的元素,同理剩下的表示第二行,第三行和第四行中的元素。之后第二行可以看到 b[0] 中具体存储的是第一行中的四个元素。所以数组在内存中是按照这种规律进行存储的。
2. 二维数组的初始化
二维数组主要提供了以下几种初始化的方式
(1) 由于二维数组在内存中是线性存放的,因此可以将所有的数据写在一个花括号内,即
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
(2) 为了更直观地表示元素的分布,可以用大括号将每一行的元素括起来,即
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
// 或者
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
对于上面代码中的两种方式,我们更推荐第二种方式。因为第二种方式更加直接,虽然占用空间变大了,但是也更容易被理解。
(3) 二维数组也可以仅对部分元素赋初值
int a[3][4] = {{1}, {5}, {9}};
上面的这段代码将对数组中第每一行的第一个元素进行赋值,其余的部分将自动补零。
(4) 如果希望整个二维数组初始化为0,那么直接在大括号里写一个0即可:
int a[3][4] = {0};
(5) C99同样增加了一种新特性:指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0:
int a[3][4] = {[0][0] = 1, [1][1] = 2, [2][2] = 3};
(6) 二维数组的初始化也能偷懒,让编译器根据元素的数量计算数组的长度。但只有第1维的元素个数可以不写,其他维度必须写上:
int a[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
3. 二维数组的访问
二维数组的访问的具体方式如下
// 数组名[下标]
a[0][0]; // 访问a数组中第1行第1列的元素
b[1][3]; // 访问b数组中第2行第4列的元素
c[3][3]; // 访问c数组中第4行第4列的元素
跟访问一位数组相似,同样是使用下标访问数组中的元素。同样需要注意下标的取值范围,以防止数组的越界访问。比如 int a[3][4],其“行下标”的取值范围是 0~2,“列下标”的取值范围是 0~3,超出任何一个下标的访问都会造成越界。
参考
[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P20
欢迎大家关注我的知乎号(左侧)和经常投稿的微信公众号(右侧)