【C# 数组详解】Array 定义、初始化、遍历、内存原理与面试高频问题

🚀 C# 数组(Array)详解:定义、初始化、遍历、内存原理与面试常问

📌 数组是 C# 中最基础的数据结构,也是后续学习集合(List、Dictionary、LINQ)的根基。


一、什么是数组?

数组(Array)是一个存储相同类型元素的固定长度集合

你可以理解为:

数组 = 一组同类型变量的集合,通过索引访问。

例如:

csharp 复制代码
int[] numbers;

访问方式:

csharp 复制代码
numbers[0]
numbers[1]
numbers[2]

✅ 数组的核心特点

  • 只能存储相同数据类型
  • 长度固定(创建后不能改变)
  • 内存连续存储
  • 索引从 0 开始
  • 数组是引用类型

二、数组的声明与初始化


1️⃣ 声明数组(仅声明,不分配内存)

csharp 复制代码
int[] nums;
string[] names;
double[] scores;

⚠ 注意:此时数组为 null,还未分配空间。


2️⃣ 使用 new 分配空间

csharp 复制代码
int[] nums = new int[5];

默认值:

类型 默认值
int 0
double 0.0
bool false
string null

3️⃣ 声明时直接赋值

csharp 复制代码
int[] nums = { 10, 20, 30, 40 };

完整写法:

csharp 复制代码
int[] nums = new int[] { 10, 20, 30, 40 };

三、数组的访问与遍历


🔥 1️⃣ 使用 for 循环

csharp 复制代码
int[] scores = new int[5];

for (int i = 0; i < scores.Length; i++)
{
    scores[i] = 80 + i * 5;
}

for (int i = 0; i < scores.Length; i++)
{
    Console.WriteLine($"索引 {i} 的值为:{scores[i]}");
}

🔥 2️⃣ 使用 foreach

csharp 复制代码
int[] nums = { 5, 10, 15, 20 };

foreach (int item in nums)
{
    Console.WriteLine(item);
}

📌 区别:

  • for 可以获取索引
  • foreach 更简洁,但不能直接修改元素

四、数组是引用类型(重点)

数组在 C# 中属于引用类型。

csharp 复制代码
int[] a = { 1, 2, 3 };
int[] b = a;

b[0] = 999;

Console.WriteLine(a[0]); // 输出 999

说明:

  • ab 指向同一块内存
  • 修改 b 会影响 a

五、数组的内存结构(高分关键)

csharp 复制代码
int[] arr = new int[3];

内存分配逻辑:

  • 变量 arr 存储在 栈中
  • new 创建的数组存储在 堆中
  • 数组元素在堆中连续排列

示意:

id="ax7w37" 复制代码
栈:
arr → 地址 0x001

堆:
0x001 → [0][0][0]

📌 连续内存的好处:

  • 访问速度快
  • CPU 缓存友好(提高缓存命中率)
  • 时间复杂度 O(1)

六、常见错误(加分项)


❌ 1️⃣ 数组越界

csharp 复制代码
int[] arr = new int[3];
arr[3] = 10;   // IndexOutOfRangeException

原因:

数组索引范围是 0 ~ Length-1,而不是 1 ~ Length


❌ 2️⃣ 空引用异常

csharp 复制代码
int[] arr;
arr[0] = 10;   // NullReferenceException

原因:

没有使用 new 分配空间,arrnull


七、数组 vs List 对比

对比项 数组 List
长度 固定 可动态扩容
性能 更快 略慢
底层 连续内存 本质也是数组
使用场景 数据量固定 数据量变化

📌 实际开发中

  • 性能敏感场景 → 优先选择数组
  • 业务开发 → 多用 List

八、性能分析(简单专业版)

  • 访问元素O(1)
  • 查找元素O(n)
  • 插入/删除O(n)
  • 连续内存 → CPU 缓存友好

这也是数组比链表快的核心原因。


九、面试高频问题

1️⃣ 数组为什么是引用类型?

因为数组对象存储在堆中,变量存储的是地址。


2️⃣ 数组长度可以改变吗?

不能。数组一旦创建,长度不可改变。需要新建数组来进行扩容或修改。


3️⃣ 数组和 List 的底层关系?

List 底层本质是一个数组,当数组容量不够时,会扩容(通常是 2 倍扩容)。


🎯 总结

数组的核心知识点:

  • 固定长度
  • 引用类型
  • 连续内存
  • O(1) 访问
  • 支持多维数组与交错数组
  • 常见异常要注意
相关推荐
小强19881 分钟前
MySQL到底用不用JOIN?——从执行计划、数据量、分库分表角度分析最佳实践
后端
fliter8 分钟前
现在可以用纯 Rust 写 Cloudflare Workers 了,不需要一行 JavaScript
后端
byoass9 分钟前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
掘金一周18 分钟前
你们觉得房贷多少,没有压力 | 沸点周刊 4.30
前端·人工智能·后端
oldking呐呐1 小时前
MySQL从建库到删库跑路 -- 4.表的操作
后端·mysql
渐儿1 小时前
I/O 多路复用与 Reactor 模式:高性能服务的根基
后端
空中海1 小时前
Spring Boot 专家级面试题库
spring boot·后端·面试
fliter1 小时前
Cloudflare: Agent 现在可以自己注册账号、购买域名、部署上线了
后端
李日灐2 小时前
< 6 > Linux 自动化构建工具:makefile 详解 + 进度条实战小项目
linux·运维·服务器·后端·自动化·进度条·makefile
蝎子莱莱爱打怪2 小时前
小孩儿才做选择!Hermes 和OpenClaw 我都要!
人工智能·后端·github