《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介
1、二维数组概念引入
我们前⾯ (2.24)数组入门 – 保证入门 章节学习的数组是一行连续的数据,只有一个下标,称为⼀维数组
。
如果我们把⼀维数组做为数组的元素,比喻成一个整体的下标,这时候就是二维数组
。
单个数组元素
结构如下:
一维数组
结构如下:
二维数组
结构如下(像一个矩阵,有行有列):
在实际问题中有很多数据是二维的或多维的,因此 C 语言允许构造多维数组
。多维数组元素有多个下标,以确定它在数组中的位置。多维数组可由二维数组类推而得到。
2、二维数组定义
一个二维数组,在本质上,是一个一维数组的列表,一个二维数组可以被认为是一个带有 x 行和 y 列的表格。
形式如下:
type arrayName [x][y];
其中:
type
可以是任意有效的 C 数据类型
,arrayName
是一个有效的 C 标识符
,也就是数组名。
将二维数组看做一个 Excel 表格,有行有列,x 表示行数,y 表示列数,要在二维数组中定位某个元素,必须同时指明行和列。
例如:
int a[3][4];
上述代码中出现信息的解释:
- 3 表示数组有 3 行;
- 4 表示每⼀行有 4 个元素;
- int 表示数组的每个元素是整型类型;
- a 是数组名,可以根据⾃己的需要指定名字;
再详细分析如下:
int a[3][4];
二维数组在概念上是二维的,但在内存中是连续存放的
;
换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。
在 C 语言中,二维数组是按行排列的
。也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 个元素也是依次存放
。数组 a 为 int 类型,每个元素占用 4 个字节,整个数组共占用 4×(3×4)=48
个字节。
如下图:
因此可以小总结一下:
数组中的每个元素是使用形式为 a[i, j] 的元素名称来标识的,其中 a 是数组名称,i 和 j 是唯一标识 a 中每个元素的下标。
3、剖析数组在内存中的存储
我们可以打印出数组所有元素的地址。
代码如下:
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
输出的结果:
从输出的结果来看,每⼀行内部的每个元素都是相邻的,地址之间相差 4 个字节,跨行位置处的两个元
素(如:arr[0][4] 和 arr[1][0])之间也是差 4 个字节,所以二维数组中的每个元素都是连续存放的。
如下图所示:
有利于我们后期使⽤指针来访问数组的学习。
4、二维数组初始化
在创建变量或者数组的时候,给定⼀些初始值,被称为初始化。
那二维数组如何初始化呢?像⼀维数组⼀样,也是使⽤⼤括号初始化的。
4.1、不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
4.2、完全初始化
下面是一个带有 3 行 5 列的数组:
int arr3[3][5] = {
{1, 2, 3, 4, 5}, /* 初始化索引号为 0 的行 */
{2, 3, 4, 5, 6}, /* 初始化索引号为 1 的行 */
{3, 4, 5, 6, 7} /* 初始化索引号为 2 的行 */
};
内部嵌套的括号是可选的
,下面的初始化与上面是等同的:
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
4.3、按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
4.4、初始化时省略行,但是不能省略列号
int arr5[][5] = {1,2,3};//1行
int arr6[][5] = {1,2,3,4,5,6,7};//2行
int arr7[][5] = {{1,2}, {3,4}, {5,6}};//3行
5、多维数组
C 语言支持多维数组。
多维数组声明的一般形式如下:
type name[size1][size2]...[sizeN];
例如,下面的声明创建了一个三维整型数组:
int threedim[5][10][4];
《小菜狗 C 语言入门 + 进阶笔记》目录:《小菜狗 C 语言入门 + 进阶笔记》(0)简介
每日一更!
公众号、优快云等博客:小菜狗编程笔记
谢谢点赞关注哈!目前在飞书持续优化更新~
日更较慢有需要完整笔记请私我,C/C++/数据结构-算法/单片机51-STM32-GD32-ESP32/嵌入式/Linux操作系统/uboot/Linux内核-驱动-应用/硬件入门-PCB-layout/Python/后期小程序和机器学习!