值类型与引用类型
值类型:int bool ······ 枚举 结构体 这些都是值类型
引用类型:字符串 数组 类
要说这个就要从CPU说起,CPU里有缓存 分一级缓存,二级缓存
其中一级缓存速度最快
栈放在一级空间
堆放在二级空间
可以参考上图(一波灵魂的画图。。。)
而值类型与引用类型最大的区别就是
值类型在栈空间里开辟,如果我现在这样写int a = 10; int b = a;这是在做赋值把a的值赋给b 那么他会在栈里边在开辟一块空间来存储
虽然存储的结果是一样的,但是我修改任何单独的一个,都不会影响到另一个,比如我把b的值改为20,那么a的值还是10
引用类型就刚好相反,因为引用类型在栈里存储的是堆的地址,如果我现在写string str1 = "abc"; string str2 = str1; 那么str1和str2指向的都是堆里的同一块地方
数组的小练习题
int[] array = {2,3,4,5,6,7}
/*
要求(1) 把这个数字反向打印出来 意思就是结果要在控制台打成7,6,5,4,3,2,1
要求(2) 求数组所有元素的和 加在一起就好 先声明一个新的变量默认值0,然后在循环里 加在一起最后打印 完美!!
*/
//第一小问
//肯定要先写一波for循环
//要倒序,就要从他的总长度开始-1
//不能数组越界访问到0号元素就停止
//--计数
for(int i = array.Length - 1; i >= 0; i--){
//打印array[i],控制台显示结果
Console.WriteLine(array[i]);
}
//第二小问
//声明一个新的变量,用来存储数组相加在一起
int a = 0;
//条件可以不用变,直接用第一问的就好
for(int i = array.Length - 1; i >= 0; i--){
//这是灵魂所在 ,我知道有人看不懂 这样写也行 a = a + array[i]; 这两句话的意思是一样的!!!
a += array[i];
}
//最后打印一下
Console.WriteLine(a);
排序
冒泡排序
冒泡排序的主要逻辑是先拿第一个数12和第二个数35进行比较,如果结果是12小 ,那就交换,如果结果比第二个数要大,就不交换,然后拿第二个数和后面继续比较,直到确定出一个最大的数放在最后一个。然后进入下一轮循环,直到彻底排完序。
举个例子:
比较了几轮 数据 5 1 3 2 0 比较了几次
0 1 3 2 0 5 4
1 1 2 0 3 3
2 1 0 2 2
3 0 1 1
0 1 2 3 5
int[] a;
a.Length 数组长度的意思
轮数 Length - 1
次数 Length - 轮数 - 1
//举个例子
int[] array = {3,2,6,5,4,7};
//冒泡排序
//轮数
for(int i = 0;i < array.Length - 1;i++){
//次数
for(int j = 0;j < array.Length - i - 1;j++){
//如果当前的数大于他后面的那个数
if(array[j] > array[j+1]){
//交换 需要个临时变量
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
//循环打印
for(int i = 0; i < array.Length; i++){
Console.WriteLine(array[i]);
}
选择排序
选择排序每一轮选一个最小的数放在前面, 比如 5和1 嗯 1小 然后我不交换,只是单纯的记录一下,然后拿1和后面进行比较,到最后0的时候,0最小了,要放在前面0和5做一个交换
举个例子:
比较了几轮 数据 5 1 3 2 0 比较了几次
0 0 1 3 2 5 4
1 1 3 2 5 3
2 2 3 5 2
3 3 5 1
0 1 2 3 5
//选择排序
for(int i = 0; i < array.Length - 1; i++){
//记录当前拿的是哪一个数,位置是多少
int index = i;
int num = array[i];
//i + 1是看的纵列数据的位置 第一行记录的是0 第二行记录1 都是拿后面的数和后面进行比较
//j < array.Length 这句话意味着比较到哪个位置,如果写j <= array.Length或者j < array.Length - 1结果都是不对的
for(int j = i + 1;j < array.Length;j++){
//比较
//用前面的数和后面的比较
if(num > array[i]){
//如果后面的比前面的小,就记录他
index = j;
num = array[j];
}
}
//交换位置
//声明一个临时变量
int tmp = array[i];
array[i] = num;
array[index] = tmp;
}
//循环打印
for(int i = 0; i < array.Length; i++){
Console.WriteLine(array[i]);
}
插入排序
插入排序 就类似玩扑克牌,拿到第一张(这里叫第一个数)的时候先不用看,等拿到第二个数进行比较,如果新拿的数比第一个数大就放后面,比第一个数小就放前面
举个例子:
比较了几轮 数据 5 1 3 2 0 比较了几次
0 5 0
1 1 5 1
2 1 3 5 2
3 1 2 3 5 3
4 0 1 2 3 5 4
//插入排序
for(int i = 0; i < array.Length - 1;i++){
//int j = i + 1这句话的意思是 直接忽略第零轮,直接从第一轮开始与第一个数比较
//j-- 是因为次数是反向的
for(int j = i + 1; j > 0;j--){
//后面的数比前面的小,交换
if(array[j] < array[j-1]){
//临时变量 交换
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
二维数组
也可以叫多为数组,因为他几维数组都可以
声明 第一维长度,第二维长度
int[,] array = new int[2,3]{ { 1, 2, 3 } , { 1, 2, 3 }} ;
int[,] map = new int[,]{ { 1, 2, 3 }, { 4, 5, 6 } };
Int[] a = {1,2,3,4,5}; int[] b = {6,7,8,9,10};
{{1,2,3,4},{4,5,6,7},{7,8,9,10}}
Int[,] array = new int[3,4];
Int[,] array = new int[3,4] {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Int[,] array = new int[,] {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Int[,] array = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Array[1,3]; [2,2];
Int[,,] array = {{{1,2},{2,3}},{{},{}},{{},{}}};
随手笔记 在别的语言里 二维数组 有a[0][1] 这样写的 在c#里a[0,1]
foreach 遍历
//迭代类型var 必须和后面的迭代集合匹配,也可以使用模糊数据类型var
//注意foreach不能修改值,只能读取
foreach (迭代类型 迭代变量名 in 迭代集合)
{
//循环体
}