C#二维数组的声明、初始化和使用(附带实例)
二维数组是一种特殊的多维数组,多维数组是指可以用多个索引访问的数组,在声明时,用多个中括号或者在中括号内加逗号,就表明是多维数组,有 n 个中括号或者在中括号内有 n 个逗号,就表示是 n+1 维数组。
下面以最常用的二维数组为例讲解多维数组的使用。
在计算机中,二维表结构可以使用二维数组来表示。使用二维表结构表示快捷酒店每一楼层的房间号的效果如下图所示。

图 1 二维表结构表示的楼层房间号
二维数组常用于表示二维表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
声明二维数组的语法如下:
例如,声明一个 int 类型的二维数组,可以使用下面两种形式:
对于二维数组,有两种为数组分配内存的方式。

图 2 二维数组内存分配(第一种方式)

图 3 二维数组内存分配(第二种方式)
在上面的代码中,由于为每一维分配的内存空间不同。因此,a 相当于一个不规则二维数组。

图 4 二维数组索引与行列的关系
二维数组的初始化主要分为 3 种:
使用这种方式对二维数组进行赋值时,通常使用嵌套的循环实现,例如,上面的代码可以修改为如下形式:
例如:
例如:
程序运行效果如下:
下面以最常用的二维数组为例讲解多维数组的使用。
C#二维数组的声明
想象一下,快捷酒店的每一楼层都有很多房间,这些房间都可以构成一维数组,如果这家酒店有 500 间房,并且所有的房间都在同一楼层里,那么拿到 499 号房钥匙的旅客可能就不高兴了,因为从 1 号房走到 499 号房要花好长时间。因此每家酒店都有很多楼层,每一楼层都会有很多房间,形成一个立体的结构,把大量的房间均摊到每一楼层,这种结构就是二维表结构。在计算机中,二维表结构可以使用二维数组来表示。使用二维表结构表示快捷酒店每一楼层的房间号的效果如下图所示。

图 1 二维表结构表示的楼层房间号
二维数组常用于表示二维表,表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。
声明二维数组的语法如下:
type[,] arrayName; type[][] arrayName;
- type:二维数组的数据类型;
- arrayName:二维数组的名称。
例如,声明一个 int 类型的二维数组,可以使用下面两种形式:
int[,] myarr; // 声明一个int类型的二维数组,名称为myarr int[][] myarr; // 声明一个int类型的二维数组,名称为myarr与一维数组一样,二维数组在声明时也没有分配内存空间,同样也可以使用关键字 new 先分配内存,然后才可以访问每个元素。
对于二维数组,有两种为数组分配内存的方式。
1) 直接为每一维分配内存空间
例如,定义一个二维数组,并直接为其分配内存空间,代码如下:int[,] a = new int[2, 4]; // 定义一个2行4列的int类型二维数组上面的代码定义了一个 int 类型的二维数组 a,二维数组 a 中包括两个长度为 4 的一维数组,内存分配如下图所示:

图 2 二维数组内存分配(第一种方式)
2) 分别为每一维分配内存空间
例如,定义一个二维数组,分别为每一维分配内存空间,代码如下:int[][] a = new int[2][]; // 定义一个2行的int类型二维数组 a[0] = new int[2]; // 初始化二维数组的第1行有2个元素 a[1] = new int[3]; // 初始化二维数组的第2行有3个元素通过第二种方式为二维数组分配内存如下图所示:

图 3 二维数组内存分配(第二种方式)
在上面的代码中,由于为每一维分配的内存空间不同。因此,a 相当于一个不规则二维数组。
C#二维数组的初始化
二维数组有两个索引(即下标),构成由行列组成的一个矩阵,如下图所示。
图 4 二维数组索引与行列的关系
二维数组的初始化主要分为 3 种:
- 为单个二维数组元素赋值;
- 为每一维数组元素赋值;
- 同时为整个二维数组赋值。
1) 为单个二维数组元素赋值
为单个二维数组元素赋值,即首先声明一个二维数组,并指定行数和列数,然后为二维数组中的每个元素进行赋值,例如:int[,] myarr = new int[2, 2]; // 定义一个int类型的二维数组 myarr[0, 0] = 0; // 为二维数组中的第1行第1列赋值 myarr[0, 1] = 1; // 为二维数组中的第1行第2列赋值 myarr[1, 0] = 1; // 为二维数组中的第2行第1列赋值 myarr[1, 1] = 2; // 为二维数组中的第2行第2列赋值
使用这种方式对二维数组进行赋值时,通常使用嵌套的循环实现,例如,上面的代码可以修改为如下形式:
int[,] myarr = new int[2, 2]; // 定义一个int类型的二维数组 for (int i = 0; i < 2; i++) // 遍历二维数组的行 { for (int j = 0; j < 2; j++) // 遍历二维数组的列 { myarr[i, j] = i + j; // 为遍历到的二维数组中的第i行第j列赋值 } }
2) 为每一维数组元素赋值
为二维数组中的每一维数组元素赋值时,首先需要使用“数组类型 [ ] [ ]”形式声明一个数组,并指定数组的行数,然后分别为每一维数组元素赋值。例如:
int[][] myarr = new int[2][]; // 定义一个2行的int类型二维数组 myarr[0] = new int[] { 0, 1 }; // 初始化二维数组的第1行 myarr[1] = new int[] { 1, 2 }; // 初始化二维数组的第2行
3) 同时为整个二维数组赋值
同时为整个二维数组赋值时需要使用嵌套的大括号,将要赋值的数据包含在里层大括号中,每个大括号中间用逗号(,)隔开。例如:
int[,] myarr = new int[2, 2] { { 12, 0 }, { 45, 10 } }; int[,] myarr = new int[,] { { 12, 0 }, { 45, 10 } }; int[,] myarr = { { 12, 0 }, { 45, 10 } };以上 3 种形式实现的效果是一样的,都是定义了一个长度为 2 行 2 列的 int 类型二维数组,并进行了初始化,其中,后两种形式会自动计算数组的行数和列数。
C#二维数组的使用
【实例 1】创建一个控制台应用程序,模拟制作一个简单的客车售票系统,假设客车的座位是 9 行 4 列,使用一个二维数组记录客车售票系统中的所有座位号,并在每个座位号上都显示“【有票】”,然后用户输入一个坐标位置,按<Enter>键,即可将该座位号显示为“【已售】”。代码如下:static void Main(string[] args) { Console.Title = "简单客车售票系统"; // 设置控制台标题 string[,] zuo = new string[9, 4]; // 定义二维数组 for (int i = 0; i < 9; i++) // for循环开始 { for (int j = 0; j < 4; j++) // for循环开始 { zuo[i, j] = "【有票】"; // 初始化二维数组 } } string s = string.Empty; // 定义字符串变量 while (true) // 开始售票 { Console.Clear(); // 清空控制台信息 Console.WriteLine("\n 简单客车售票系统" + "\n"); // 输出字符串 for (int i = 0; i < 9; i++) { for (int j = 0; j < 4; j++) { System.Console.Write(zuo[i, j]); // 输出售票信息 } Console.WriteLine(); } Console.WriteLine("请输入座位行号和列号(如:0,2)输入q键退出:"); s = Console.ReadLine(); // 售票信息输入 if (s == "q") break; // 输入字符串“q”退出系统 string[] ss = s.Split(','); // 拆分字符串 int one = int.Parse(ss[0]); // 得到座位行数 int two = int.Parse(ss[1]); // 得到座位列数 zuo[one, two] = "【已售】"; // 标记售票状态 } }代码注解:
- 在第 13 行代码中的 while(true) 用来设置一个无限循环,以便能够循环输入坐标位置。
- 在第 28 行代码中用到了字符串的 Split() 方法,该方法用来根据指定的符号对字符串进行分隔。
程序运行效果如下:
简单客车售票系统
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
请输入座位行号和列号(如:0,2)输入q键退出:6,1
简单客车售票系统
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【已售】【有票】【有票】
【有票】【有票】【有票】【有票】
【有票】【有票】【有票】【有票】
请输入座位行号和列号(如:0,2)输入q键退出:
...