《交互式程序设计 第2版》一2.3.2 数组

简介:

本节书摘来华章计算机《交互式程序设计 第2版》一书中的第2章 ,第2.3.2节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3.2 数组

数组比之前提到的数据类型要复杂一点。一个数组由1个或多个变量排列而成。要记住一点,本书一直在讨论的三个工具,它们工作起来是稍有不同的。我们现在就来看看,这三个工具各是如何填充数组的。
数组是由多个元素组成的列表。在以下的程序段里,数组包含的是整数1、2和3。这并没什么精妙之外,但会是个不错的起点。
注意图2-2数组里每个元素头上的标记:numbers[0]、numbers[1]和 numbers[2],这些是访问数组的运算符。不是录入错误,的确是从0开始。等我们学会怎么创建数组之后再回头讨论这个0的问题。
image

图2-2:含3个整数的数组
这个数组在Processing里是这样建立的:

int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;

首先看这个数组的声明,如图2-3所示。
image

图2-3:Processing对数组的声明,该数组包含3个整数
数组所包含的元素可以是任何类型,甚至是你自己创造的类型。以上代码块将数组里每一个元素都赋值了。可使用运算符[ ]来访问方括号中序号所指的那个元素。

int x = numbers[0];

上面这一行将x赋值为1,因为数组中首个元素是1。

int y = numbers[1] + numbers[2];

上面这一行将y赋值为第2个元素和第3个元素的和,即2+3,得到5。如果把等号放在带有访问运算符的后面,则是对其指向的数组元素赋值:

numbers[0] = 1;
numbers[0] = 5;

numbers[0]起初等于1,现在变成了5。数组就是一个仓库,其中每个元素是盒子,盒子里存放着声明里所规定类型的数据。数组元素一旦赋值,则其值一直不变,直到将它重新赋值。
以上我们对数组中的元素逐个赋值,每次赋值使用了一行代码。其实也可以在一行内完成数组的赋值。

int arr[] = {1, 2, 3};

int arr[3] = {1, 2, 3};

注意,定义数组的时候不需要指明它的长度,例如上面的第一种写法。当然,要一次性地将数组元素全部赋值,你需要知道每个数组元素的值,否则还是建议你使用我们最先提到的逐个赋值的方法。
接下来我们看一下在Arduino中如何声明数组。其实跟在Processing中是差不多的,在Arduino或C++里创建数组有下面三种方式:

int arr[] = {1, 2, 3};

int arr[3];

int array[3] = {1, 2, 3};

图2-4把数组分解成了几个部分。
image

图2-4:在C++中创建数组
Processing唯一不同于Arduino的是,Processing支持用new这个关键字创建数组。如果知道数组中所有元素的值,你可以这样写:

int array[3] = {1, 2, 3};

否则,你应该这样写:

int[] arr = new int[3];

我们已经掌握了数组的基础知识,现在可以去探讨一些较复杂的内容。首先我们来看看你必定会遇到的一些错误,例如各种各样的“越界访问”。越界访问就是指你访问了一个并不存在于数组中的元素。
在Arduino和C++里,数组可以这样初始化:

char arr[3] = {'a', 'b', 'c'}; 
char badArrayAccess = arr[3];

当你想使用变量badArrayAccess时,你会发现不仅它不是一个字符,而且访问它会导致程序崩溃。数组arr有3个变量,但现在你却试图访问它的第4个变量,与当初定义arr时所指定的数组长度不符。另一个常见错误则是把与数组类型不符的变量存放于数组中,例如:

char arr[3];// 字符型数组,含有3个变量
float f = 2.3; 
arr[0] = f; // 糟糕!arr是字符型,所以“2.3”会自动变成“2” 
bool b = true; 
arr[1] = b; // 糟糕!arr是字符型,所以真值b会变成 “1”再赋值给arr[1]

编译平台不会对以上的代码报错,但结果是不对的,因为数组声明它所装载的元素是字符变量,而你却往里面放浮点型和布尔型变量,因此它们会被自动转化成字符型变量,后果经常难以控制和预测。表2-1对各个数据类型作了简明的比较,并列出在3种编程语言中的表示方式。
表2-1:数据类型比较
image

相关文章