深入探究数组基础知识(第一部分)
介绍
数据管理是所有应用程序的支柱。应用程序的性能在很大程度上取决于访问和操作数据时选择的数据结构。每种数据结构都有自己的实现和含义。
以前,CPU 专门针对处理一维数据的指令集进行了优化,这被称为矢量处理。现代GPU是矢量处理器的改良版本,用于支持快速计算。
数组(又名向量)是最重要且最广泛使用的数据结构,本指南将涵盖数组数据结构的深层方面。
数组简介
数组被定义为具有固定长度的相似数据的集合,以线性方式存储。数组中的每个元素都可以通过索引(数值)访问,并且每个索引都可以通过应用数学运算来计算。
在下面的例子中
- 书是一个数组
- 章节是存储在书中的数据
- Book 数组中的每一章都可以通过索引访问
char[] book = {'A','B','C','D'};
数组声明和初始化
声明是定义占位符名称的过程,前面加上其类型,数组用方括号声明为
type[] name_of_placeholder;
char[] book;
初始化意味着借助new 关键字或数组初始化器为对象分配内存。
name_of_placeholder = new data_type[size_of_array];
book = new char[4];
数组初始化器:数组也可以使用初始化列表{用逗号分隔的数组元素}来声明,并且在声明数组引用时拥有数据时适用。例如,创建长度为 4 的数组,其值为 A、B、C、D。
char[] array = new char[] {'A','B','C','D'};
char[] array = {'A','B','C','D'};
char[] array = new[] {'A','B','C','D'};
隐式类型数组:var是变量类型占位符(在 C# 3 中引入),其类型可以使用类型推断从表达式的右侧获取,这使我们能够消除显式数据类型。可以使用var声明上述示例如下:
var array = new char[4]; // creates array of length 4
var array = new char[4] {'A','B','C','D'};
var array = new char[] {'A','B','C','D'};
var array = new[] {'A','B','C','D' };
数组初始化器不能与var关键字一起使用,因此var array = { 'A', 'B' , 'C', 'D' };无效。设计团队决定避免使用数组初始化器及其对解析器的副作用,以避免解析嵌套的{}块。解决方案是将new关键字与 var结合使用,以实现隐式类型语法。
内存分配
主内存被划分为单独的逻辑部分,堆被称为动态内存。这意味着运行时请求的内存在堆中分配。
数组的内存以连续方式分配。这意味着,如果您创建一个包含四个char元素的数组,则应用程序将分配:在 32 位操作系统上,char为 2 字节,引用变量为 4 字节,因此 (2 * 4) + 4 = 12 字节在 64 位操作系统上,char为 2 字节,引用变量为 8 字节,因此 (2 * 4) + 8 = 16 字节,并且可以存储在内存地址 2000 到 2008(2008 不包括)中,如下所示:
index Data Memory addresses
_____
0 | A | 4000 <= name of the array
|_____| pointing to initial address
1 | B | 4002
|_____|
2 | C | 4004
|_____|
3 | D | 4006
|_____|
这是一个普遍的情况,实际分配可能会根据操作系统的实现而略有不同。
读写
通过使用数组名称和方括号内的索引来读取数组的值:
array_name[numeric_index]
e.g output
book[2] C
C的内存地址可以使用内存的初始地址、索引和大小来计算:
initial address + (index * size of data type)
4000 + (2 * 2)
4000 + 4
=> 4004
为了修改数组元素,需要将赋值运算符(=)与数组名称和索引一起使用:
array_name[numeric_index] = new_element
book[0] = 'P' // Replace A with P
修改后的书籍数组将是:
'P'
重要提示:C# 中有两种类型的数据:
值类型:ValueType 元素在初始化时始终具有固定的默认值,例如int元素的默认值为0,bool 元素的默认值为false。
引用类型:引用类型的默认值为null。
数组基础知识
从零开始的编号:数组索引始终从 0 开始,最后一个索引的值为length_of_array - 1。
固定长度:数组一旦创建,就不能改变其大小来增加长度。需要使用复制操作将较小数组中的值存储到较大的数组中。
默认情况下,数组中的每个元素都初始化为其默认值。
每个数组对象都派生自Array类,并继承了 Array 类的数据成员 (length、Rank) 和方法 (GetLowerBound、GetUpperBound)。
数组还可以将矩阵数据表示为二维、多维或交错数组。在交错数组中,每行的大小可以不同,并且可以根据需要在运行时定义。
在 32 位环境中,数组的默认最大大小为 2 千兆字节 (GB),在 64 位环境中,可以调用gcAllowVeryLargeObjects方法将限制扩展为 40 亿个条目。
数组不是线程安全的;多线程可以修改同一类型的数据,这可能会导致不一致问题。
数组类和数组结构
using System.Linq;
int[] intArr = new [] { 11, 2, 0, 14, 112 };
List<int> intList = intArr.OfType<int>().ToList(); // convert array to List
- ICloneable:支持克隆方法。
int[] arr = new int[2];
int[] temp = (int[])arr.Clone();
- <font style="verti
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~