书接上回。
我们讲了变量和数据类型,都是单个的变量,及其值。那么这个数组,是用来装载多个数据的一种结构。你可以把数组想象为一个数字列表,每个数字对应不同的值。可以从头按照数字遍历这个列表,并获取其相对应的值。
下例是数组的声明和赋值。
int myArray[3];
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
这种的我们成为静态数组,声明的时候,给定了数字元素的长度,并对其单个索引,赋予相应数值。声明中[3]表示数组长度=3,int表示数组内元素均是int型。上例用的是挨个给数组元素赋值,其实还有一种写法:
int myArray[3] = {1,2,3};
这种写法的好处是不占地方,简洁美观。
如果声明了数组,其初始值是多少呢。得看数组元素的数据类型,本例中int型,那就是0。
数组的起始索引位置=0。这是主流编程语言的通用做法。最大索引值当然就是size-1。如果越界了呢?
int myArray[3];
myArray[3] = 21;
// 这个就是错误的。最大索引位置3-1=2.索引3就越界了,编译不通过。
静态数组的缺点是,数组长度不能变化。当你事先不能确定数组的长度时,应使用动态数组声明。动态数组,可以更具需要长度进行伸缩。【注意是伸缩,可短可长】。ArrayResize函数就是用来给数组伸缩长度的。
double myDynamic[];
ArrayResize(myDynamic,3);
myDynamic[0] = 1.50;
注意,动态数组声明时,[]内不能显式指定长度。函数ArrayResize给数组伸缩长度后,就可以对其进行赋值操作了。
上面说的,都是一维数组。一列值,很线性。接着说多维数组,先从二维数组说起。说白了,你可以把二位数组理解为一张excel表,有行有列,然后用行列索引号,就能定位到某个单元格,这时就可以对该单元格进行操作。MQL5的二位数组原理是一样的。
double myDimension[3][3];
myDimension[0][1] = 1.35;
声明一个3行3列的元素。并对其[0][1]元素进行赋值。注意,多维数组不过是对一维数组的扩充,遵循数组定义的所有特性。比如索引起始位置=0。
当然了,上述例子是静态的多维数组。也肯定有动态的多维数组。
double myDimension[][3]; // 指定不确定数量的数组,且每个数组的长度=3
int rows = 5;
ArrayResize(myDimension, rows); // 为数组指定行数=5.
数组允许你较为简单地遍历一个数据集。
string myArray[3] = {"cheese","bread","ale"};
for(int index = 0; index < 3; index++)
{
Print(myArray[index]);
}
for循环,程序里用的就太多了,必知必会。我们使用临时变量index控制循环层数。然后根据这个索引值,逐一取出myArray数组的值。
其中,index < 3,是限制了长度,3=数组长度。这是我们预先知道了数组长度,如果不知道呢?如果数组长度不确定,且数值很大呢?MQL5给我们提供了ArraySize函数,用于获取数组的长度。
int myDynamic[];
ArrayResize(myDynamic,10);
int size = ArraySize(myDynamic);
for(int i = 0; i < size; i++)
{
myDynamic[i] = i;
Print(i); // 输出: 0, 1, 2... 9
}
上例中,使用ArraySize获取数组长度,并赋值给变量size。for循环使用 i < size 控制循环层级。与静态数据遍历原理相同。