一维数组
数组用来将相同数据类型存储在存储单元里组成的构造类型,数组的每个成员称为一个数组元素。
一、一维数组的初始化
- 动态初始化
1.数据类型[] 数组名 = new 数据类型[数组长度];此时数组中每一个元素都是默认值,int默认值为0,float默认值为0,bool的默认值为false,char的默认值为’\0’,表示空字符,string的默认值为""
2.数据类型[] 数组名 = new 数据类型[数组长度]{元素1,元素2,…};
3.数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; - 静态初始化
数据类型[] 数组名 = {元素1,元素2,…};
二、数组的访问
- 从0开始计数,数组中第一个元素的下标为0
- array.Length是数组的长度,只读
- 访问数组时,如果下标所对应的数组元素不存在就会引发数组越界异常
三、引用类型
- 值类型(存储在栈内存):存的是具体的值,int、float、bool、char都是值类型
- 引用类型(存储在堆内存):栈内存里存的是堆内存的地址,数组是引用类型,string是特殊的引用类型。数组属于一种引用类型,因此如果将数组名b赋给数组a,那么数组b在操作数组元素时,实质上操作的还是数组a,如图所示
二维数组
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。
一、二维数组的定义
- 数据类型 [,] 数组名;
二、二维数组的初始化
- 动态初始化
1.数据类型 [,] 数组名 = new 数据类型[第一维长度(常量表达式),第二维长度(常量表达式)];
2.数据类型 [,] 数组名 = new 数据类型[,]{数组值}; - 静态初始化
数据类型 [,] 数组名 = {数组值};
int[,] array = {{7,6,3},{2,8,5}}如下图所示
三、二维数组的元素访问
- 数组名[第一维下标,第二维下标]
- 谨防数组越界
四、数组的长度
- 总⻓度(⼆维数组的元素个数):array.Length
- 第⼀维的⻓度:array.GetLength(0)
- 第n维的⻓度:array.GetLength(n-1)
五、二维数组的遍历
for (int i = 0; i < heroData.GetLength(0); i++)
{
for (int j = 0; j < heroData.GetLength(1); j++)
{
Console.Write(heroData[i,j] + "\t");
}
Console.WriteLine();
}
六、foreach迭代遍历
- foreach语法
//迭代类型必须和后面的迭代集合匹配,也可以使用模糊数据类型var
//迭代集合可以是数组、字符串、集合等
//foreach性能消耗要⼤⼀点,所以能⽤for的尽量⽤for
foreach (迭代类型 迭代变量名 in 迭代集合)
{
//循环体
}
- 迭代遍历是只读的,不能修改
int[] a = { 1, 2, 3, 4, 5, 6, 7 };
foreach (int x in a)
{
////可以快速遍历一维数组
Console.WriteLine(x);
}
int[,] map = { { 1, 2, 3 }, { 4, 5, 6 } };
foreach (int x in map)
{
//快速遍历二维数组
//注意:迭代变量x是只读的,不允许修改,如x++会出现错误
Console.WriteLine(x);
}