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

C# Array /获取多维数组中第一个维度的长度。//1.数组的声明,声明数组类似声明变量,需要指定数组中存储的数据类型,一般数组变量的名称以复数的形式命名(加s)//数组中数据的操作都是基于索引的,索引从0开始,到数组的长度(Length)-1结束,用于访问数组中存储的数据。交错数组其实就是元素为数组的数组,换句话说就是交错数组中的每个元素都可以是维度和大小不同的数组,所以有时交错数组也被称为“数组的数组”。//如果初始化的时候指定了数组的初始值,那么就可以省略指定数组的长度,会自动根据数组的初始值判定数组的长度。 阅读详情

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

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


一、什么是数组?

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

你可以理解为:

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

例如:

int[] numbers;

访问方式:

numbers[0]
numbers[1]
numbers[2]

✅ 数组的核心特点

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

二、数组的声明与初始化


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

int[] nums;
string[] names;
double[] scores;

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


2️⃣ 使用 new 分配空间

int[] nums = new int[5];

默认值:

类型默认值
int0
double0.0
boolfalse
stringnull

3️⃣ 声明时直接赋值

int[] nums = { 10, 20, 30, 40 };

完整写法:

int[] nums = new int[] { 10, 20, 30, 40 };

三、数组的访问与遍历


🔥 1️⃣ 使用 for 循环

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

int[] nums = { 5, 10, 15, 20 };

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

📌 区别:

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

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

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

int[] a = { 1, 2, 3 };
int[] b = a;

b[0] = 999;

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

说明:

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

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

int[] arr = new int[3];

内存分配逻辑:

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

示意:

栈:
arr → 地址 0x001

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

📌 连续内存的好处:

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

六、常见错误(加分项)


❌ 1️⃣ 数组越界

int[] arr = new int[3];
arr[3] = 10;   // IndexOutOfRangeException

原因:

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


❌ 2️⃣ 空引用异常

int[] arr;
arr[0] = 10;   // NullReferenceException

原因:

没有使用 new 分配空间,arr 为 null。


七、数组 vs List 对比

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

📌 实际开发中:

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

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

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

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


九、面试高频问题

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

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


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

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


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

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


🎯 总结

数组的核心知识点:

  • 固定长度
  • 引用类型
  • 连续内存
  • O(1) 访问
  • 支持多维数组与交错数组
  • 常见异常要注意
C#数组深度解析:从内存布局到高性能实战 数组作为基础数据结构,其核心在于连续内存分配带来的性能优势。这种设计使得CPU缓存命中率更高,索引访问达到O(1)时间复杂度,成为高性能计算的基石。在C#中,数组不仅是类型安全的容器,更是处理实时数据流、传感器读数、游戏对象状态等场景的利器。通过理解一维、多维与交错数组的内存布局差异,掌握Array.Sort、Array.Copy等优化方法,开发者能在MQTT数据处理、上位机开发、Unity游戏对象池等实际工程中显著提升效率。本文结合内存管理与性能优化实战,深入探讨数组在C#中的高级应用与常见陷阱。 阅读详情

相关推荐

C#数组底层原理与实战:内存模型、性能优化与避坑指南

数组是编程中最基础的数据容器之一,本质是一段连续内存上的固定长度序列,支持O(1)随机访问。在C#中,数组并非值类型而是引用类型,其内存布局直接决定了遍历速度、GC行为和线程安全表现。理解数组的底层原理,不仅能驾驭List<T>、Span<T>、ArrayPool<T>等衍生类型,还能在数组增加、数组去重、数组分割等高频操作中避免踩坑。从环形队列到树状数组,从多线程传参到上位机缓冲,数组始终是高性能场景的基石。以工程实践视角拆解C#数组的核心机制与真实业务中的取舍。

weixin_32642109的博客 276

C#中的数组

一.数组简介 数组是一种数据结构,它包含若干相同类型的变量。数组是使用类型声明的: 数组具有以下属性: 数组从字面上理解就是存放一组数,但在 C# 语言中数组存放的并不一定是 数字,也可以是其他数据类型。 一个变量只能存放一个值,如果需要计算 10 个变量中的最大值,则需要定 义 10 个变 量,非常麻烦。 数组的索引从零开始:具有 n 个元素的数组的索引是从 0 到 n-1。 数组元素可以是任何类型,包括数组类型。 在一个数组中存放的值都是同一数据类型的,并且可以通过循环以及数据操 作的方法对

weixin_57765394的博客 2万+

数组学习指南:从内存布局到跨语言实战与算法精讲

数组是编程中最基础也最易踩坑的数据结构,看似简单的声明、赋值与遍历背后,隐藏着内存布局、类型推导、边界处理等多层细节。数组在内存中是一段连续同类型元素的存储空间,这种结构决定了它支持O(1)随机访问,同时也让数组名与指针的区别、二维数组的存储方式、动态数组的扩容策略成为开发者必须理解的核心原理。从C语言二维数组初始化,到JavaScript数组方法,再到树状数组上的二分查找与连续子数组乘积最大值等经典算法,数组在不同语言和场景下的表现差异巨大。本文系统梳理了数组的底层机制、跨语言操作差异、常见算法模式以及工

weixin_33788244的博客 400

C#教程7:数组

数组是数据的集合。标量变量一次只能保存一项。数组可以容纳多个项目。这些项目称为数组的元素。数组存储相同数据类型的数据。每个元素都可以通过索引来引用。数组是从零开始的。第一个元素的索引为零。数组是引用类型。

gongdiwudu的专栏 1万+

C#字符串内存与驻留池:从原理到高并发实战优化

字符串是.NET中最常用却最易被误解的基础类型,其内存行为直接影响GC压力、比较性能与内存占用。理解字符串字面量的元数据驻留、new string()的托管堆分配、以及string.Intern()背后的哈希表映射机制,是解决‘==返回false’‘内存异常增长’等典型问题的关键。在高频重复键(如分类码、仓库编号)场景中,合理驻留可减少99%冗余字符串;而在用户输入、动态Token等场景滥用则引发内存泄漏。结合ReadOnlySpan<char>零分配比较与StringComparison.Ordinal,

weixin_40192258的博客 560

跨语言数组深度对比:从底层原理到工程实践

数组是编程语言中最基础的复合数据类型,也是连接硬件内存与上层业务逻辑的桥梁。理解数组索引为何从0开始,掌握其背后的内存寻址设计,才能真正看懂不同语言中数组的迥异表现。C/C++的数组直接映射连续内存,Java的数组自带越界检查,Python的list本质是对象容器,JavaScript的Array则灵活到可以存储任意类型。本文从数组的底层原理出发,对比主流语言的实现方式与隐藏坑点,覆盖指针数组、二维数组、数组越界、数组去重等高频操作,并结合字符数组、KMP算法next数组和树状数组等经典应用场景,帮助开发者

weixin_34167819的博客 377

C#精挑整理知识要点6 数组(建议收藏)

1.C#数组简介 数组从字面上理解就是存放一组数,但在 C# 语言中数组存放的并不一定是数字,也可以是其他数据类型。 数组的特点: 在一个数组中存放的值都是同一数据类型的。 数组中某个指定的元素是通过索引来访问的。 所有的数组都是由连续的内存位置组成的。 数组从零开始建立索引,即数组索引从零开始。 2.一维数组 一维数组在数组中最常用,即将一组值存放到一个数组中,并为其定义一个名称,通过数组中元素的位置来存取值 语法: //定义数组 数据类型[] 数组名; //初始化数组中的元素 数据类型[] 数组名 =

Mr、黄 702

华为交换机链路聚合对接思科交换机链路聚合故障

2台华为交换机采用堆叠方式与思科交换机之间使用链路聚合,华为交换机与cisco交换机链路捆绑接口频繁UP/DOWN,业务中断。

网络工程师日常的博客 2116

C# 数组(Array)

定义以及细节: 数组是一个存储相同类型元素的固定大小的顺序集合。 int [ ] intArray; 其中, int用于指定被存储在数组中的元素的类型。 [ ]指定数组的秩(维度)。秩指定数组的大小。 intArray指定数组的名称。 细节: 一维数组 只有一种元素固定的集合 多维数组 多维数组最简单的形式是二维数组。 交错数组 C# 支持交错数组,即数组的数组。 传递数组给函数 您可以通过指定不带索引的数组名称来给函数传递一个指向...

LiKe11807的博客 9458

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7592

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

C#数组深度解析:从内存布局到性能优化实战

数组作为数据结构的基础概念,在计算机科学中代表连续内存存储的数据集合。其核心原理在于内存的连续性,这带来了优异的缓存局部性,能显著提升数据访问效率。从技术价值看,数组不仅是高效的数据容器,更是理解内存管理、算法复杂度及硬件协作的窗口。在应用场景上,数组广泛用于游戏开发、科学计算、高频交易等性能敏感领域,也是现代语言中高级集合类型的底层实现基础。本文聚焦C#数组,深入探讨其System.Array基类特性、多维与交错数组的性能差异,并结合ArrayPool共享池和Span内存视图等热词,揭示如何在高性能场景下

weixin_30855099的博客 421

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

C#数组(超级深度解析C#数组)

这份 C# 数组深度教程,从内存底层布局一路延伸到项目实战,把一维数组、多维矩形数组、交错数组讲得通透透彻。不只停留在基础语法,拆解了托管堆内存结构、零基索引原理、Array.Resize 的底层真相,理清空数组与 null 数组的大坑。 教程涵盖遍历、排序、二分查找等经典算法,对比二维数组与交错数组性能差异,剖析数组协变隐患,还加入 Span 零拷贝、内存缓存优化、图像像素处理等前沿实战内容。同时整理高频 bug 与面试真题,兼顾课堂学习、刷题训练与 AI 视觉开发,零基础能看懂,老手也能夯实底层功底。

dawn_007_seven的博客 459

用Python玩转Milvus:从安装SDK到完成第一个向量搜索Demo

本文为Python开发者提供了一份详细的Milvus向量数据库实战指南。文章重点讲解了如何规避版本兼容性陷阱,正确部署Milvus服务端并安装匹配的Python SDK。通过一个电影推荐系统的完整案例,演示了从数据建模、集合创建、向量插入、索引构建到执行混合搜索的全流程,帮助开发者快速上手并完成第一个向量搜索Demo。

weixin_29239279的博客 192

交叉编译Qt6.5.3(RK3568开发板)

注意,如果使用其它版本的交叉编译器的话,请确保你的交叉编译器能够支持 C++17标准。为确保后续交叉编译没问题,需要确保开发板使用的GLIBC版本不小于2.34版本。到 linaro 网站上下载交叉编译工具,我下载的是 gcc-linaro-11.3.1-2022.06-x86_64_aarch64-linux-gnu.tar.xz。安装 CMake ,最低要求3.16版本,如果要静态编译,需要3.21及以上版本。我使用的3.27版本。:指定为最后交叉编译后的Qt6.5.3库的安装目录。

m0_46309425的博客 5101

130道C#面试题详解与解析

本文整理了130道常见的C#面试题,涵盖C#基础、.NET框架、ASP.NET、数据库、多线程、设计模式等多个方面。主要内容包括:C#基础语法(访问修饰符、递归算法、委托与事件等)、.NET框架基础(CTS/CLS/CLR、GC等)、ASP.NET开发(页面传值、身份验证等)、数据库与ADO.NET(常用对象、SQL注入防范等)、多线程与并发(进程线程区别、线程安全等)、面向对象编程(三大特性、构造器等)、集合与泛型(List/Set/Map等)、Web服务与XML(WebService、SOAP等)、编程

德仔 2150

20、超声多普勒成像技术全解析

本文全面解析了超声多普勒成像技术,涵盖彩色血流成像(CFI)、能量多普勒成像、超快多普勒成像和矢量多普勒成像的原理、流程、优势及临床应用场景。详细探讨了各成像模式的特点,如CFI的血流方向与速度可视化、能量多普勒对小血管的高灵敏度、超快多普勒的高帧率分析能力,以及矢量多普勒消除角度依赖性的创新方法。同时分析了技术面临的挑战及未来发展趋势,包括更高分辨率、人工智能辅助诊断和便携式设备的发展,为医学影像研究和临床诊断提供重要参考。

z2a3b4c5d的博客 277

数组(Array)核心原理精讲:连续内存、随机访问与增删操作的复杂度权衡——Hello 算法学习笔记

数组(Array)是计算机科学中最基础、使用最广泛的线性数据结构,也是学习数据结构的起点。本篇文章围绕 Hello 算法英文仓库中 [array.md](https://link.gitcode.com/i/abde5e48e98e1d3d70b2a2d82e5a8664) 的核心讲解展开,并结合仓库中 C++、Python、Go 等语言的真实示例代码(如 [array.cpp](https://

gitblog_00142的博客 411

1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务

本文基于 SAP Cloud Application Programming 编程模型的 OData 服务开发教程的第一步,简述了 SAP Business Technology Platform 里 Business Application Studio 开发工具的打开方式,创建 Dev Space 以及 CAP 项目的创建步骤,以及如何通过 schema.cds 和 service.cds 分别创建 OData 模型和 OData 服务,最后通过 ports preview 打开 OData 服务预览页

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1797

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java数组深度解析:从内存模型到算法应用与性能优化

在数据结构中,数组是一种基础且核心的线性表,其本质是一段连续的内存空间。这一特性使得CPU可以通过基地址和索引直接计算元素位置,从而实现O(1)时间复杂度的随机访问,这是数组高性能的底层原理。在Java编程中,数组不仅是存储相同类型数据的固定长度容器,更是理解集合框架(如ArrayList)动态扩容机制的基石。其连续内存模型带来了极快的访问速度,但也导致了长度固定的局限。在实际工程中,数组广泛应用于算法实现(如双指针、滑动窗口解决LeetCode问题)、批量数据处理以及性能敏感场景。通过工具类java.ut

weixin_33924312的博客 491

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Hello 算法》数组与链表章节总结:要点回顾与 11 个高频 Q&A 深度解析

本篇文章基于《Hello 算法》日文版仓库中 [chapter_array_and_linkedlist/summary.md](https://link.gitcode.com/i/a192cea5891678a1f621efd68ffaf1ac) 这一章节总结页展开,将「数组 vs 链表 vs 动态数组」的核心结论、以及涉及内存分配、缓存局部性、Python 对象引用等 11 个高频疑难问答,

gitblog_00371的博客 441

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lottie-web 快速上手教程:三步把 After Effects 动画渲染成网页动画

你是否也遇到过这种情况:设计师交来一段漂亮的动画,你却要逐帧截图或用 CSS 重新实现一遍?或者想在页面里加几段引导动画,GIF 体积又大、放大还发虚?lottie-web 是一个免费开源的动画渲染库:它把 After Effects 导出的 JSON 文件,在浏览器里直接播放成流畅的矢量动画,不用切帧、也不用重画。 ## 它是什么:让 AE 动画在浏览器里“原生”播放 先理清一条链路:设计师

gitblog_00139的博客 675

C#面试题100道系统梳理:从类型系统到异步编程的核心知识域解析

在面向对象编程中,类型系统与内存模型是理解语言行为的基石。值类型与引用类型在赋值语义、内存分配和生命周期管理上存在本质差异,而装箱拆箱机制则直接影响性能表现。委托与事件实现了类型安全的回调与观察者模式,泛型与集合在类型安全和性能之间取得平衡,LINQ与async/await则代表了现代C#的声明式查询与异步编程范式。这些核心概念广泛应用于高并发服务、桌面应用和游戏开发等场景。本文围绕C#面试高频考点,系统梳理类型系统、面向对象、委托与事件、泛型、LINQ、异步编程等知识域,帮助开发者建立完整的知识体系。

weixin_33985679的博客 423

C#数组实现循环队列:从假溢出到动态扩容的完整指南

队列作为一种基础数据结构,其先进先出(FIFO)特性在计算机科学中有着广泛的应用。从操作系统任务调度到网络请求处理,队列都扮演着关键角色。在C#开发中,队列不仅是常用数据结构,更是理解消息队列等高级概念的基础。数组实现队列面临的核心挑战是“假溢出”问题,即数组物理空间未满但逻辑上无法继续插入。循环队列通过取模运算将数组首尾相连,有效解决了这一难题。本文以C#为例,详细讲解如何实现一个支持动态扩容的泛型循环队列,涵盖指针移动、空满判断、数据迁移等关键技术细节,并对比了链式队列的缓存友好性差异。掌握数组队列的实

weixin_34318272的博客 944

Unity3DTraining 面试题整理:Unity 游戏开发进阶面试全攻略(Lua / C / C++ / Unity / 算法 / 网络 / 设计模式)

> **导读**:本文以 [Doc/马三的面试题整理.md](https://link.gitcode.com/i/1e2661938046554cf4b53665647ea528) 为骨架,系统梳理 Unity 客户端开发岗位面试中的高频考点,涵盖 Lua、C#、C++、Unity 引擎、算法与 3D 数学、网络通信、设计模式七大板块,并对每一道题给出可复述的完整答案。文章同时以 Unity3D

gitblog_00845的博客 995
上一篇: C# 可空类型(Nullable)详解
下一篇: C# 字符串(String)详解与常用操作示例
bugcome_com
博客等级 码龄3年 32粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcome_com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值