1. 入门
想象一下普通数组就像一只长长的披萨盒,所有的披萨块都排成一排——好吃,但有点单调。
现在再想想工作日程表或者国际象棋棋盘。那里面一切都被安排成行和列——也就是表格。这就是二维数组的经典用法啦。
在现实生活中,二维数组随处可见:
- 员工工资表(行——员工,列——月份)。
- 屏幕上的图片(每个“格子”是像素的颜色,有两个坐标:X和Y)。
- 矩阵计算和数据处理。
- 国际象棋棋盘或者井字棋的棋盘。
有时候二维数组也叫矩阵(这个词是从数学里来的)。
有很多地方你作为程序员会用到二维数组。几乎任何桌游的实现——都是现成的二维数组:“国际象棋”、“跳棋”、“井字棋”、“海战”:
“国际象棋”或者“海战”的棋盘,简直就是为二维数组量身定做的,格子的坐标只需要用数字来表示。不再是“兵 e2 → e4”,而是“兵 (4,1) → (4,3)”。这样你写代码会更轻松。
2. 二维数组的声明语法
其实只有第一次声明才会有点慌!一步一步来就好。
通用规则
类型[,] 数组名;
这里括号里的逗号,不是编译器熬夜喝咖啡写错了,而是明确告诉你:这个数组是二维的。
例子
int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;
创建数组
设置大小:行数和列数。
matrix = new int[3, 4]; // 3行,4列
这就是一个3x4的小表格:想象一下Excel里有3行4列。
你也可以直接声明变量并创建二维数组:
int[,] matrix = new int[3, 4];
还可以直接用值初始化(和一维数组差不多):
int[,] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 表格 3行,3列
注意:用这种方式初始化时,所有行的长度必须一样。不能第一行3个元素,第二行2个。
可视化示意图
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← 列 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← 第0行 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← 第1行 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← 第2行 (Row 2)
└─────┴─────┴─────┴─────┘
每个元素都用一对索引[行, 列]来定位。
3. 索引和访问元素
在二维数组里,访问元素要用两个索引:
- 第一个——行号
- 第二个——列号
matrix[1, 2] = 99; // 在第二行(索引1),第三列(索引2)
如果你玩过国际象棋,记住:索引是从0开始的。也就是说,第一个元素是[0, 0]。
写入和读取
int[,] data = new int[5, 2];
data[1, 1] = 5; // 写入
int value = data[1, 1]; // 读取
在内存里大概长这样:
4. 填充二维数组
来写个代码,把矩阵填成1到12的连续数字,这样你就能明白它是怎么工作的。
int[,] matrix = new int[3, 4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row, col] = value;
value++;
}
}
这里外层循环遍历行,内层循环遍历列。
示意图:
执行后:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. 维度:获取行数和列数
很多时候你需要“动态”获取数组的大小。在C#里有个很方便的方法GetLength()。
int[,] matrix = new int[3, 4];
int rows = matrix.GetLength(0); // 行数(第一个维度)- 3
int columns = matrix.GetLength(1); // 列数(第二个维度)- 4
Console.WriteLine($"行: {rows}, 列: {columns}");
别和Length搞混——对于二维数组,它是所有元素的总数(行 × 列)。
6. 输出二维数组到屏幕
输出二维表格通常用双重循环——就像在控制台里画迷宫。例子:
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
Console.Write(matrix[row, col] + "\t"); // "\t"——制表符,让输出更美观
}
Console.WriteLine(); // 换行
}
输出示例:
1 2 3 4
5 6 7 8
9 10 11 12
顺便说一句,你现在已经学会用几行代码就能“画”出漂亮的表格啦!
7. 多维数组
还有一个关于数组的有趣事实,你可能已经猜到了。如果能做二维数组,那三维的也可以吗?
没错,数组可以有任意多的维度。这种数组叫多维数组。
怎么声明多维数组
只要用逗号分隔需要的维度数量就行:
int[,,,] matrix = new int[2, 3, 4, 5];
这里我们有一个四维数组:
- 第一个坐标2个元素,
- 第二个3个,
- 第三个4个,
- 第四个5个。
在内存里,这种数组就是一个很大的“数据立方体”,顺序打包起来。
怎么访问元素
访问元素时要同时给出所有索引:
matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
- 索引还是从0开始,就像C#里一直那样。
- 这样的数组总共有2 × 3 × 4 × 5 = 120个元素。
多维数组的实际例子
- 2D——表格、国际象棋棋盘、图片。
- 3D——计算机图形里的“立方体”、科学计算的数据(比如不同空间和时间点的温度)。
- 4D及以上——很少用,但在高级数学、仿真、机器学习等领域会遇到。
GO TO FULL VERSION