阅读:0       作者:严长生

数组的定义、初始化及特点详解

数组(Array),就是把有限个数据类型一样的元素按顺序放在一起,用一个变量命名,然后通过编号可以按顺序访问指定位置的元素的一个有序集合。

其实简单来说,就是为了方便而把这些元素放在一起。我们通过编号去获取每个元素,这个编号叫作下标或者索引(Index),一般的语言是从 0 开始的。

我们常说的数组一般指一维数组,当然还有多维数组,虽然多维数组并不常用。

多维的实现其实是数组的某些元素本身也是一个数组,这里以一个标准的二维数组为例进行介绍。其实,二维数组相当于每个元素的长度都一样的一个一维数组(也就是我们常说的数组),和数学中的矩阵类似。

在很多弱语言中,并不要求每个元素的长度都一样,可以某些元素是数组(长度可以不一样),某些元素不是数组,甚至每个元素的数据类型都不同。这里讲的二维数组指的是标准的二维数组。

注:弱类型语言也叫作弱类型定义语言,简称弱语言。弱语言一般对语言的标准没有特别的要求。比如在 JavaScript 中用 var 声明变量,不会指定该变量是哪种类型。强语言对编写规则比较有要求,所以不容易出现问题,很多开发工具都会帮助检查其基本规则。

在了解了什么是数组之后,我们来看下数组的存储结构。

数组的存储结构

首先我们来看下一维数组的存储结构,如图 1 所示。


图 1 数组的存储结构

其实,我们先要确定一个值,也就是数组的长度;然后,系统会根据我们声明的数据类型开辟一些空间(当然,每种数据类型需要开辟的空间也不一样)。这时,这些空间就归这个变量所有了。一般在编程语言的实现中,这些空间会默认对我们声明的数据类型赋值,比如整型值是 0,布尔值是 false,等等。

所以有以下几种情况。
1) 只声明了指定长度的空间,没有初始化值(以整型为例,所有值都会默认为 0,如图 2 所示)。


图 2 在未初始化值时会默认初始化为 0

2) 声明了指定长度的空间,初始化了部分值(以整型为例,未初始化的值都会默认为 0,如图 3 所示)。


图 3 只初始化了前三个值,其余值自动初始化为 0

3) 声明了指定长度的空间,初始化了全部的值,如图 4 所示。


图 4 初始化了全部的值

数组在编程语言中的初始化及操作

在多数语言中,数组的声明都是非常简单的,一般有下面几种声明方式(以 Java 语言、整型为例,其他语言、数据类型差异不大)。
int [] num1 = new int[10];
int [] num2 = {1,2,5};
num3[0]=1;
num3[1]=2;
num3[2]=5;
数组指定位置的元素的值,是通过下标获取的,下标在大部分语言中是从 0 开始的。
int [] num= {1,2,5};
int a = num[0];//a 的值为 1
int b = num[1];//b 的值为 2
为数组赋值,和获取元素的值类似,可以直接赋值。
int [] num = {1,2,5};
num[1] = 10;//现在 num 的数组元素分别为 1,10,5
数组常用的另一种方式是按顺序访问每一个值,一般通过编程语言中的循环语句实现(比如 for 循环)。
int [] num = {1,2,5};
for(int i = 0; i<num.length;i++){
    system.out.println(num[i]);
}
上面展示了循环打印数组的值的代码,其中 num.length 可以获取数组的长度。细心的同学可以发现这个 length 后面没有括号,是的,这个 length 是数组的内置属性(以 Java 为例,有些语言会同时提供两种或更多的获取数组长度的方式)。

下面我们看下二维数组的存储结构,如图 5 所示。


图 5 二维数组的存储结构

二维数组的初始化方式实际上和一维数组没有太大的区别,只不过我们需要提前确定第 1 维和第 2 维的长度。

在图 5 中,第 1 维的长度为3,每维的元素又是一个长度为 6 的数组。

多维数组在编程语言中的初始化及操作

由于多维数组与一维数组的初始化及访问区别不大,下面集中进行列举。
int [][] num = new int[3][3];
int [][] num2 = {{1,2,3},{4,5,6},{7,8,9}};
int a = num2[1][0];//a 的值为 4
int b = num2[1].length;//b 的值为3,即第二维的长度
二维数组的访问方式其实和一维数组和多维数组的访问方式没什么区别,我们只需要理解为数组的元素也是个数组。

数组的特点

因为本身存储的方式,数组有如下特点。

1) 定长

数组的长度是固定的,这是数组最重要的一个特点。

只要我们在声明时确定了数组的长度,在赋值时就算没有给数组的所有元素赋值,未赋值的元素也是有初始默认值的;而如果我们在赋值时发现数组的长度不够用,这时也没有什么好办法,因为数组的长度无法改变。要是想继续存放数据,就只能重新声明一个数组了。

2) 按顺序访问

我们在访问一个数组中的某个元素时,必须从第 1 个元素开始按顺序访问,直到访问到指定位置的元素。

这里想说明一点,虽然我们在开发时可以直接通过下标访问指定位置的元素,但是实际上计算机在处理时也是按顺序访问的。