首页 理论教育 Arduino单片机实战开发技术-二维数组应用

Arduino单片机实战开发技术-二维数组应用

时间:2023-10-23 理论教育 版权反馈
【摘要】:二维数组通常用于编程中显示表格数据。显然,你也可以将数组编写为:int myFireSensors[10][3];大多数程序员认为二维数组的组织形式是行-列格式,因此后一种定义是“十行传感器,三列楼层”。让我们编写一个使用二维字符数组的简短程序。在清单9-2中,嵌套for循环用于显示数组的内容。这是因为图9-3中的变量是在堆栈外分配的,而days[][]数组的左值是静态存储类,不是在堆栈外分配的。

Arduino单片机实战开发技术-二维数组应用

二维数组通常用于编程中显示表格数据。例如,在一栋三层楼的建筑中,可能会在每层楼设置10个传感器火灾报警系统。你可以将这些传感器组织为:

int myFireSensors[3][10];

可用于存储整栋楼上所有传感器的当前状态。显然,你也可以将数组编写为:

int myFireSensors[10][3];

大多数程序员认为二维数组的组织形式是行-列格式,因此后一种定义是“十行传感器,三列楼层”。这两种形式中哪一种更好?无所谓,选择一个对你有意义的使用即可。

让我们编写一个使用二维字符数组的简短程序。虽然你可以将程序编写为一个简单的字符串数组,但也可以将数据组织为字符数组。清单9-2给出了代码。

代码清单9-2.Using a Two-Dimensional Array of chars

字符数组由以下语句初始化

将CHARSINDAY设置为10的原因是,星期三是最长的日期名称,包含9个字符。如果我们将它们视为字符串,然后你需要使用10个字符定义星期三,结果是一个包含7行10列字符的表。(www.xing528.com)

为什么要使用静态数组?实际上,清单9-2中代码的呈现方式是静态数组,在编译器处理数据的方式中不起多大作用。最大的不同之处在于数据未在堆栈上分配(静态数组在程序运行时访问到达对应位置才发生更改,它的输出应与图9-4所示对应)。

关于使用静态存储类定义的数据,需要记住的另一件事是,只定义了该数据的一个实例,并且它是在加载时定义的。例如,如果定义了静态变量,这个静态变量一个被调用了一千次的函数使用,那么该变量只创建一次,也就是当程序第一次启动时创建。对函数的所有千次调用都使用相同的变量。这就是为什么静态的数据在函数调用之间保留其值。静态变量和普通变量的区别是:静态变量在首次访问时创建,后续直接访问,不访问就被挂起;而普通变量访问到时创建,访问过后清除。

在清单9-2中,嵌套for循环用于显示数组的内容。第一个Serial.print()文件调用代码:

Serial.print((int)&days[i][0]);//Show the lvalue

使用地址运算符“&”索引显示日期数组的特定元素。第二个Serial.print()调用只打印一个换行符。循环代码:

然后使用i和j索引显示数组的每个元素。请注意for循环的表达式2是如何编写的。为什么expression2最终会导致for循环终止?(提示:考虑终止字符。)

如果仔细查看图9-4,你会注意到每行的左值正好比前一个元素多10字节。显然,这些行是“背靠背”存储在内存中的。还请注意,与图9-3中的左值相比,左值具有相对较低的内存地址。为什么?这是因为图9-3中的变量是在堆栈外分配的,而days[][]数组的左值是静态存储类,不是在堆栈外分配的。

图9-4 程序输出结果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈