C#个人学习笔记之 数组的介绍--006
C# 数组 超详细学习笔记
一、数组概述
1. 什么是数组
数组是相同数据类型的一组有序数据集合,属于引用类型,存放在堆内存中。
作用:批量存储多个同类型数据,避免定义大量单独变量。
2. 数组特点
- 长度固定:数组一旦创建,长度不可修改
- 元素类型统一:所有元素必须是声明的同一数据类型
- 下标(索引)从
0开始,最后一个索引 = 数组长度 - 1 - 支持多维数组、交错数组
二、一维数组(最常用)
1. 数组声明 + 初始化 四种写法
写法1:先声明,再赋值(分步初始化)
// 1. 声明数组(仅定义引用,无内存空间)int[]nums;// 2. 创建数组并分配内存,指定长度为 3nums=newint[3];// 3. 给元素逐个赋值nums[0]=10;nums[1]=20;nums[2]=30;写法2:声明 + 分配内存(默认值填充)
数值类型默认值:0;引用类型默认值:null;bool 默认:false
// 创建长度为 5 的 int 数组,元素默认都是 0int[]arr=newint[5];写法3:声明 + 直接赋值(简写1)
// 编译器自动识别数组长度int[]arr=newint[]{1,2,3,4};写法4:最简写法(日常笔记/开发首选)
// 省略 new int[],最简洁int[]arr={11,22,33};2. 数组取值 & 改值
通过索引操作元素:
int[]arr={100,200,300};// 取值Console.WriteLine(arr[0]);// 输出 100// 改值arr[1]=999;Console.WriteLine(arr[1]);// 输出 999异常提醒:访问超出索引范围会抛出
IndexOutOfRangeException索引越界异常。
3. 遍历一维数组(3种常用方式)
方式1:for 循环(可修改元素)
适合需要操作下标、修改元素场景
int[]arr={5,6,7,8};// arr.Length 获取数组长度for(inti=0;i<arr.Length;i++){Console.WriteLine(arr[i]);}方式2:foreach 循环(只读遍历,推荐纯查看)
语法简洁,不能修改数组元素,仅用来读取
int[]arr={1,3,5,7};foreach(intiteminarr){Console.WriteLine(item);}方式3:while/do-while 循环(了解即可)
int[]arr={2,4,6};inti=0;while(i<arr.Length){Console.WriteLine(arr[i]);i++;}三、二维数组(表格/矩阵格式)
二维数组 =行 + 列,分为规则二维数组和交错数组。
1. 规则二维数组(每行列数一致,主流用法)
声明与初始化
// 写法1:指定行数、列数,默认值 0int[,]arr1=newint[2,3];// 2行3列// 写法2:直接赋值int[,]arr2=newint[2,2]{{1,2},{3,4}};// 写法3:最简简写int[,]arr3={{10,20},{30,40}};取值、赋值
int[,]arr={{1,2},{3,4}};arr[0,1]=99;// 第0行第1列 赋值Console.WriteLine(arr[1,0]);// 取第1行第0列二维数组遍历
int[,]arr={{1,2,3},{4,5,6}};// GetLength(0) = 总行数 GetLength(1) = 总列数introws=arr.GetLength(0);intcols=arr.GetLength(1);for(inti=0;i<rows;i++){for(intj=0;j<cols;j++){Console.Write(arr[i,j]+" ");}Console.WriteLine();// 换行}2. 交错数组(数组中的数组,每行长度可不同)
语法:int[][]锯齿数组,每行是一个独立一维数组
// 1. 声明交错数组:3行,每行长度暂时不确定int[][]jagArr=newint[3][];// 2. 单独给每一行分配不同长度jagArr[0]=newint[2]{1,2};jagArr[1]=newint[3]{3,4,5};jagArr[2]=newint[1]{6};// 遍历交错数组foreach(varrowinjagArr){foreach(variteminrow){Console.Write(item+" ");}Console.WriteLine();}区别总结:
int[,]:规则二维数组(矩形)int[][]:交错数组(锯齿形,每行长度不一样)
四、数组常用属性 & 静态方法(System.Array)
1. 核心属性
数组名.Length:获取总元素个数(一维/二维通用)
2. 常用静态方法(需引用using System;)
1)Array.Sort() 数组升序排序
int[]arr={9,1,5,3};Array.Sort(arr);// 原地升序foreach(variteminarr)Console.Write(item+" ");// 1 3 5 92)Array.Reverse() 数组反转
int[]arr={1,2,3};Array.Reverse(arr);foreach(variteminarr)Console.Write(item+" ");// 3 2 13)Array.Clear() 清空元素(恢复默认值)
int[]arr={10,20,30};Array.Clear(arr,0,arr.Length);// 从索引0开始,清空全部Console.WriteLine(arr[0]);// 04)Array.IndexOf() 查找元素索引
找到返回索引,找不到返回-1
int[]arr={2,4,6};intindex=Array.IndexOf(arr,4);Console.WriteLine(index);// 1五、值类型 & 引用类型 数组内存简析(面试常考)
- 数组本身是引用类型,变量名存的是内存地址(栈中)
- 数组元素:
- 元素为
int/double/bool(值类型):元素值存在堆内存 - 元素为
string/自定义类(引用类型):堆中存地址
- 元素为
- 数组赋值是地址传递,两个数组变量指向同一块内存:
int[]a={1,2,3};int[]b=a;// b 和 a 指向同一个数组b[0]=99;Console.WriteLine(a[0]);// 99 (a 也被修改)六、易错点总结(笔记重点标记)
- 索引从
0开始,严防索引越界 - 数组长度定义后不可更改,如需动态扩容用
List<T> foreach只能读取,不能修改数组元素int[,]和int[][]语法、结构完全不同,不要混用- 数组直接赋值属于引用传递,不是值拷贝
七、课后练习(自测)
- 定义一个字符串数组,存储 5 个姓名,遍历输出
- 定义二维数组 3行2列,赋值并嵌套循环遍历
- 对一个乱序 int 数组排序、反转并输出
