数组

title: 历史.
content: 第一台数码计算机使用机器语言编程来设置和访问资料表,向量和矩阵计算的阵列结构,以及许多其它目的。1945年,在建立第一个范纽曼型架构计算机时,约翰·冯·诺伊曼(John von Neumann)写了第一个阵列排序程序(合并排序)。阵列索引最初是通过自修改代码,后来使用索引暂存器和间接寻址来完成的。1960年代设计的一些主机,如Burroughs B5000及其后继者,使用内存分段来执行硬件中的索引边界检查。  除了机器硬件本身提供的,机器语言并没有特别支援阵列。最早的高阶编程语言包括FORTRAN(1957)、Lisp(1958)、COBOL(1960)和ALGOL 60(1960),则开始支援多维阵列,C(1972)也是如此。在C++(1983)中,对于维度固定和弹性的多维阵列,提供了类别模板。
title: 应用.
content: 阵列实作数学向量和矩阵,以及其它类型的长方表格。许多数据库是由元素为(或包含)记录的一维阵列所组成。 阵列也用于实作其它资料结构,例如列表、堆、杂凑表、双向伫列、伫列、 堆叠、字串和VLists。与基于树实作的资料结构相比,基于阵列实作的资料结构通常是简单和有空间效率的(隐式资料结构),空间成本开销很少;但阵列需要修改时则空间的复杂性相对比较差(已排序的阵列结构,与搜索树相比)。  一或多个大型阵列有时用于模拟程序内的动态内存分配,特别是固定记忆区块规划。从历史上看,这有时是可移植地分配“动态内存”的唯一方法。  阵列可用于决定程序中的部分或完整控制流程,简洁地替代多个codice_1语句。它们在上下文中被称为控制表,并与专门构建的解释器结合使用,其控制流将依照阵列所含有的值来变动。该阵列可能含有指向执行子程序的指针(或由codice_2语句执行的相关子程序编号)。
title: 元素标识符和寻址公式.
content: 当资料物件储存在阵列中时,个别物件通常借由非负整数的索引变量来选取。索引也称为下标,可将阵列的值对应到储存物件。  有三种方式对阵列的元素进行索引:  阵列可以具备多个维度,因此常见使用多重索引来存取阵列。例如,从零开始索引的情况下,有三行和四列的二维阵列codice_3需要存取第二行和第四列的元素时,表达式可为codice_4。因此,二维阵列使用两个索引下标,三维阵列使用三个索引下标,n维阵列使用n个索引下标。  指定元素所需的索引数称为阵列的维度,维数或阵列的秩。  标准阵列中每个索引会被限制在一定范围内的连续整数(或某些枚举类型的连续值), 而元素位址则是对索引值的“线性”计算公式。
title: 一维阵列.
content: 一维(或单维)阵列是一种线性阵列,其中元素的存取是以行或列索引的单一下标表示。  譬如考虑C编程语言的阵列宣告 codice_5  语法为: datatype anArrayName [sizeofArray];  在上述范例中,被宣告的阵列将包含codice_6型别的10个元素,可为任何整数值。这样,阵列元素的索引下标则为0-9(含)。例如,codice_7和codice_8分别是第一个和最后一个元素的表达。  对于以线性寻址的向量,索引为i的元素处于位址B+c×i,其中B是固定的基底位址,c为常数, 有时称为位址增量或跨步。  如果有效的元素索引从0开始,则常数B只是阵列第一个元素的位址。因此C语言指定阵列的索引一定从0开始;许多开发人员会将该元素称为“第零”而不是“第一”。  然而若适当选择基底位址B,来作为第一个元素的索引起始值。譬如阵列有五个元素,索引为1到5,基底位址B以B+30c来替换,则相同阵列的这些元素索引将转为31到35。如果编号从0开始,则常数B可能不是任何元素的位址。
title: 多维数组.
content: 普通数组采用一个整数来作下标。多维数组(高维数组)的概念特别是在数值计算和图形应用方面非常有用。我们在多维数组之中采用一系列有序的整数来标注,如在[ 3,1,5 ] 。这种整数列表之中整数的个数始终相同,且被称为数组的“维度”。关于每个数组维度的边界称为“维”。维度为"k"的数组通常被称为"k"维。  多维数组的数组名字,在表达式中自动转换为数组首元素地址值,但这个首元素实际上是去除数组下标第一维之后的数组剩余部分。例如:
title: C/C++标准中的数组.
content: C/C++数组概念有双重含义,一是数据类型,二是实体(entity)。 C语言标准中规定,一个数组类型描述了连续分配的非空的具有特定元素对象类型的对象集合。这些元素对象的类型称为元素类型(element type)。数组类型由元素类型与元素的数目确定。  在C语言中,可以显式定义一个数组类型,例如:  数组名作为数组实体的标识符,具有特殊性,不同于整型、浮点型、指针型或结构类型等变量标识符。这是因为数组是一组元素的聚集,不能把一个聚集看作一个值直接读出(这个值指的是右值),也不能把一个聚集看作一个地址直接赋值(即左值)。因此,数组名作为左值、右值,在C语言标准中都有特殊规定:  例如,  根据上述C语言标准中的规定,表达式codice_11的值的类型是char (*)[6],即指向整个数组的指针;而表达式 s 则被隐式转换为指向数组首元素的指针值,即 char* 类型。同理,表达式codice_12,等效于表达式codice_13。
title: 数组下标运算符.
content: C语言标准中定义,数组下标运算(array subscripting)有两个运算数,一个为到类型type的指针表达式,另一个运算符为整数表达式,结果为类型type。但没有规定两个运算数的先后次序。因此,有以下推论:  例如:
title: 不完整的数组类型.
content: 不完整的数组类型属于不完整类型(incomplete type),即缺乏信息去确定其尺寸。例如:
title: 柔性数组成员.
content: C99规定,struct的最后一个成员可以是不完整的数组类型。例如:  Visual C++ 2015支持上述语法。
title: 可变长数组.
content: C99引入了可变长数组(variable length array,简称VLA),只能定义在块作用域或函数原型作用域,必须无链接性。其数组长度在编译期可变,但在运行期该数组对象一旦生成就不可改变数组长度了。例如:
title: 程序设计.
content: 数组设计之初是在形式上依赖内存分配而成的,所以必须在使用前预先请求空间。这使得数组有以下特性:  因为简单数组强烈倚赖电脑硬件之内存,所以不适用于现代的程序设计。欲使用可变大小、硬件无关性的数据类型,Java等程序设计语言均提供了更高级的数据结构:ArrayList、Vector等动态阵列。

Summary: 在计算机科学中,阵列资料结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的资料结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的储存地址。

Tableau (structure de données): En informatique, un tableau est une structure de données représentant une séquence finie d'éléments auxquels on peut accéder efficacement par leur position, ou "indice", dans la séquence. C'est un type de conteneur que l'on retrouve dans un grand nombre de langages de programmation.