多维数组和二维数组定义方式相似,比如我们定义三维数组int[,,] prices,四维数组int [,,,] prices等。多维数组一般很少用,在三维游戏领域三维空间里可能要用到三维数组,三维以上数组笔者至今没有见到使用的例子。多维数组的定义还有一种等效书写方式,这种书写方式是和Java等语言定义多维数组相同的, 比如定义二维数组也可以写为int [][]prices, 定义三维数组可以写为int[][][] prices,当然这种写法过于繁杂,在C#里已经不提倡用。
数组元素的访问和修改是通过下标进行的,下标代表数组元素在数组中的位置,我们可以使用“数组名[下标]”的方式访问数组的元素,假设我们有一维数组a和二维数组b两个数组,下标和数组元素的对应如下图:
一维数组a:
a[0] a[1] a[2] a[3] a[4]
二维数组b:
b[0,0] b[0,1] b[0,2] b[0,3] b[0,4]
b[1,0] b[1,1] b[1,2] b[1,3] b[1,4]
b[2,0] b[2,1] b[2,2] b[2,3] b[2,4]
如上图,我们可以通过a[1]访问和修改数组a的第二个元素,可以通过b[1,2]来访问和修改b数组的第二行第三列的元素,这里要注意的是,C#中无论是一维数组和多维数组下标都是从0开始的,这样也就导致一个问题,比如在一维数组中,定义数组时我们定义的是数组元素个数,一个有5个元素的数组最大的下标只能到4,同理对于一个3行5列二维数组b[3,5]来说,最后一个元素是b[2,4],而不是b[3,5]。
定义一个数组之后,系统就会为这个数组分配一系列的存储空间。此时这些存储空间由系统进行初始化,为了正确的使用数组,在使用数组之前要对数组进行初始化,即向数组中装入有意义的数据。数组的初始化我们在前面已经提到过,在这里我们再详细解释一下,我们可以在定义的时候就初始化数组,但有多种初始化方式,如下:
int [] prices=new int[5]{1,2,3,4,5},定义一个数组,并用后面的数据依次初始化,等效于int[]prices={1,2,3,4,5}和int []prices=new int[]{1,2,3,4,5}。
int[] prices=new int[5],定义一个五个元素的数组,数组元素都被初始化为零。
int[] prices=new int[5]{1,2,3},错误,初始化元素个数不够。
int[] prices={},正确但没有意义,定义了零个元素的数组。
int[] prices,定义一个一维数组变量,默认值为null,不含任何元素。
int[,] prices={{1,2,3},{4,5,6},{7,8,9}},定义一个3行3列的数组,数组的元素被后面数据初始化,初始化后prices[0,0]为1、prices[0,1]为2、prices[0,2]为3、prices[1,0]为4……,等效于:
int[,]prices=new int[,]{{1,2,3},{4,5,6},{7,8,9}}和int [,]prices=new int[3,3]{{1,2,3},{4,5,6},{7,8,9}}。
int[,] prices=new int[3,3],定义一个三行三列的数组,数组元素都被初始化为零。
int[,] prices,定义一个二维数组变量,默认为null。
当然,数组可以先定义后初始化:
int [] prices=new int[5];
prices[0]=1;
prices[1]=2;
prices[2]=3;
prices[3]=4;
prices[4]=5;
如果多维数组我们也用上面方式初始化,那将是一项体力活,因此二维或者多维数组我们都用循环来初始化,如:
int[,] prices=new int [3,3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
prices[i,j]=0;
示例1,输入5个数求其中最大值:
class Program
{
static void Main(string [] args)
{
int [] num=new int[5];
int max=0;
Console.WriteLine("请输入5个数:");
for(int i=0;i<5;i++)
num[i]=Console.Read();
for(int i=1;i<5;i++)
{
if(max < num[i])
max= num[i];
}
Console.WriteLine("最大值为:{0}",max);
}
}
上面代码中我们首先定义一个5个元素的数组和一个用来记录最大值的变量max,并使用一个for循环接受键盘输入的5个数。然后我们使用一个for循环遍历整个数组,每次将max值和数组当前值num[i]进行比较,如果数组当前元素较大,就将这个值赋值给max,这样max里面保留的始终是最大的值。退出循环时max就是我们要求的最大值。
示例2,求一个3阶数字矩阵对角线的和,数字矩阵如下:
1 2 3
4 5 6
7 8 9
分析如下:
这个矩阵可以用一个3行3列的数组表示,假如数组为a,则可以表示为:
a[0,0] a[0,1] a[0,2]
a[1,0] a[1,1] a[1,2]
a[2,0] a[2,1] a[2,2]
我们看到两条对角线元素分别是a[0,0]、a[1,1]、a[2,2]和a[0,2]、a[1,1]、a[2,0],我们可以看到规律,第一条对角线的元素的两个下标满足“列下标等于行下标”,对于另外一条对角线两个下标满足“列下标+行下标等于2”,凡是满足这两个条件的数组元素都是对角线的元素,因此我们的求和算法是:遍历数组的每个元素,如果是对角线元素就加起来。程序代码如下:
class Program
{
static void Main(string [] args)
{
int [,] a={{1,2,3},{4,5,6},{7,8,9}};
int sum=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i==j || i + j == 2)
sum += a[i,j];
}
}
Console.WriteLine("和为:{0}",sum);
}
}
首先我们定义了一个二维数组并将其初始化。然后我们使用嵌套for循环遍历数组,其中外层for循环控制行标,内层for循环控制列号。再使用“if(i==j||i+j==2)"条件表达式选择出对角线元素,这个条件的意思就是:假如满足“列下标等于行下标”或“列下标+行下标等于2”的元素就在对角线上,我们对它进行累加求和。