1、数组引入的必要性
当我们需要很多个变量(同种类型)之间可能会进行一些运算,
那么以我们现有的知识储备需要定义多个变量而且名字还不能重复,
这样代码就会非常冗余,而且可读性极差--(遇到麻烦了)
2、数组定义
数组就是一些数据的集合 而且这些数据在内存中的存放地址是连续的
注意:这些数据的类型都是一样的
数组类型----引用类型
语法定义格式:
数据类型[] 数组名=new 数据类型[数量];
new--表示在托管堆中申请一块内存用来存放数据 关键字
数组在定义的时候长度(数量)一定是固定的
每个数据的类型是一样的
3、数组如何进行初始化以及赋值、遍历数组的元素 、数组的元素 、数组索引
数组的初始化--就是数组在定义时同时给每个元素赋值
初始化数组有三种语法形式:(一定是在定义的时候)
int[] a=new int[6]{12,34,56,12,34,56};
int[]a=new int[]{12,34,56}
int[]a={12,34,56,12}
数组索引--代表的是数组元素的所在位置,给位置做的编号,编号就是索引,但是这里特别注意
位置编号从0开始。第一个位置索引应该是0 第二个位置索引应该1 依次类推
最后一个元素它的索引应该是数组的长度减1。访问元素的时候我们通常是通过索引
来访问具体元素。具体的访问数组元素的语法:
数组名[索引号]--------这个整体就代表对应索引号的数组元素
注意:索引号不能大于等于数组的长度 如果出现大于等于数组的长度
这叫数组越界---编译的时候不会报错 运行的时候会报越界错误
索引很多时候可以是变量 这个变量变化就对应不同元素
数组的元素--数组中的每个数据称为数组的元素
数组元素的赋值----改变数组元素的值
访问数组元素---数组名[索引号]=值;
数组的遍历:依次访问数组中的每个元素的过程就叫做遍历数组
for(int i=0;i< 数组名.Length;i++)
{
语句;
}
foreach(var item in 数组名)
{
语句;
}
数组长度:数组中元素的个数 数组名.Length---得到数组的长度
4、数组扩容
int[] array1=new int[5]; //原数组长度为5
int[] item=new int[array1.Length]; //创建长度一样的临时数组
for (int i = 0; i < array1.Length; i++)
{
item[i] = array1[i]; //将原数组元素放入临时数组
}
array1 = new int[5]; //原数组重置长度
int count = 5;
array1 = new int[array1.Length+count]; //在原数组基础上增加5的长度
for (int i = 0;i < item.Length;i++) //临时数组值返回原数组
{
array1[i] = item[i];
}
Console.ReadKey();
5、数组删除指定元素
//删除索引3对应的值
int[] array1=new int[5] {12,45,47,45,45 }; //原数组
int[] item=new int[array1.Length]; //创建长度一样的临时数组
for (int i = 0; i < array1.Length; i++)
{
item[i] = array1[i]; //将原数组元素放入临时数组
}
array1 = new int[array1.Length-1]; //原数组重置长度-1
int k = 0;
for (int i = 0;i < item.Length;i++) //临时数组值返回原数组,不要的值去掉
{
if (i!=3) //索引不为3传值
{
array1[i] = item[i];
}
k++;
}
Console.ReadKey();
6、可变数组
在使用数组作为形参时,C# 提供了 params 关键字,使调用数组为形参的方法时,既可以传递数组实参,也可以传递一组数组元素。
1.带 params 关键字的参数类型必须是一维数组,不能使用在多维数组上;
2.使用params参数后实参可以传一个数组,也可以传;
3.带 params 关键字的参数必须是最后一个参数,并且在方法声明中只允许一个 params 关键字。
4.不能仅使用 params 来使用重载方法。
5.没有 params 关键字的方法的优先级高于带有params关键字的方法的优先级
static void Main(string[] args)
{
int a = 0;
string b = "qqq";
Print(ref a,b,new int[] { 12,14,15,14,});
Print(ref a, b, 12, 14, 15, 14,58); //可变数组写法
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadKey();
}
public static void Print(ref int a,string b, params int[] c)
{
a = 132;
b = "qwerfdsa";
}
常见习题:
冒泡排序:
//冒泡排序
int[] b = { 654, 34, 99, 98, 3, 112, 12, 11, 22 };
for (int i = 0; i < b.Length; i++) //比几次,i==第几次比,9个数 一共比9次,也可以比8次
{
for (int j = 0; j < b.Length - 1 - i; j++) //第一次for循环9个数全部比一遍比8遍,找出最大值/最小值放最后面(下次不用比),第二次for循环8个数要比7遍,以此类推...
{
if (b[j] > b[j + 1])
{
int c = b[j];
b[j] = b[j + 1]; b[j + 1] = c;
}
}
Console.WriteLine();
}
for (int i = 0; i < b.Length; i++) { Console.Write($"{b[i]}\t"); }
Console.ReadKey();
4、二维数组 和 交错数组
1、二维数组定义
语法定义格式:
数据类型[,] 数组名=new 数据类型[(行)数量,(列)数量];
int[,] aa2 = { { 45, 52, 45 }, { 23, 45, 45 }, { 23, 56, 33 }, { 98, 09, 56 } }; //有几个花括号就有几行,花括号里有几个数就有几列,这个就是4行3列的二维数组,用值表示就是[4,3],索引值从0,0开始
//二维数组遍历
for (int i = 0; i < aa2.GetLength(0); i++)
{
for (int j = 0; j < aa2.GetLength(1); j++)
{
Console.WriteLine($"{aa2[i, j]}");
}
2、三维数组定义
语法定义格式:三维数组每行的列数可以不一样,定义时行数需要定义数量,列数不需要定义
数据类型[][] 数组名=new 数据类型[(行)数量][];
/ 三维数组定义
int[][] aaa = new int[4][]; //三维数组每行的列数可以不一样,定义时行数需要定义数量,列数不需要定义
int[][] ccc = {
new int[]{11,23,22 },
new int[]{ 88,13},
new int[] { 58, 42, 88,25 },
}; //赋初值时必须在每行值前加 new 数据内型 [], 相当于几行就是几个一维数组
三维数组遍历
int[][] ss = new int[3][] { new int[] { 2, 3, 5 }, new int[] { 23, 55, 66 }, new int[] { 55 } };
for (int i = 0; i < ss.GetLength(0); i++) //先遍历每一行
{
for (int j = 0; j < ss[i].Length; j++) //再遍历每一行的个数
{
Console.WriteLine(ss[i][j]);
}
}