第十章 数组
1.声明和创建数组
数组是无序的元素序列。数组中的所有元素都具有相同类型。数组中的元素存储在一个连续性的内存块中。
int [] cakes;
无论元素是什么类型,数组始终都是引用类型。这意味着数组变量引用堆上的内存块,数组元素就存在这个内存块中。
即使数组元素是int这样的值类型,也是在堆上分配内存。这是值类型不在栈上分配内存的特例。
cakes = new int[9];
声明变量不会马上为对象分配内存,用new关键字创建实例才会。数组也是如此。
声明数组变量时不需要指定大小,也不会分配内存(只是在栈上分配一小块内存用于存储引用的内存)。
创建数组实例时才分配内存,数组大小也在这时指定。

创建数组实例时,会使用默认值对其元素初始化(0, null或false, 分别取决于是数值类型,是引用类型,还是bool类型)
2.初始化数组
创建数组实例时,所有元素都被初始化为默认值。可以修改这个行为,将数组元素初始化为指定的值。
int [] cakes = new int[5]{7,9,5,8,7};
大括号中的值不一定是常量值,它们可以是在运行时计算的值。
Random r = new Random();
int [] array = new int[3]{r.Next()%10, r.Next()%10, r.Next()%10};
初始化数组变量时可以省略new表达式的数组大小。编译器根据初始值的数量来计算大小,并生成代码来创建数组。
int [] numbers = {8,6,7,9,9}
创建由结构或对象构成的数组时,可调用构造器来初始化数组中的每个元素,如:
Time [] t = {new Time(25,6), new Time(18,9)};
3.遍历数组
所有数组都是System.Array类的实例,该类定义了许多有用的属性和方法。
int [] cakes = {6,7,8,3,6,7,8,3};
for(int index = 0;index < cakes.Length; index++)
{
int c = cakes[index];
Console.WriteLine(c);
}
// foreach语句总是遍历数组的所有元素
foreach(int c in cakes)
{
Console.WriteLine(c);
}
for语句和foreach语句遍历数组区别:
a: foreach语句总是遍历整个数组。
b: foreach语句总是从索引0遍历到索引Length-1。要反向或者以其它顺序遍历,更简单的做法是使用for语句。
c: 修改元素必须使用for语句。这是因为foreach语句的循环变量是数组每个元素的只读拷贝。

浙公网安备 33010602011771号