请读者仔细阅读图2-15的控制程序,发现虽然编写了延时子函数Yanshi,但主函数中while(1)循环体的内容还是显得“臃肿”。而且发现,每次调用Yanshi子函数之前,都执行了对P0口写入某个“可以预先确定的”数值的操作。在while(1)死循环中,如下语句被执行8次后并循环:
P0=一个预先可确定的数值,对应点亮一个指示灯;
Yanshi();//调用延时子函数
这样,我们可以将图2-14的控制程序的主函数main简化成如下样式:
对照图2-14的主函数,上述主函数形式显得十分简洁。但问题是,如何对P0口赋值呢?
既然每次送给P0口的数据是可以预先确定的,我们可以将要写给P0口的数值预先准备好(请参考表2-5),然后根据当前次序,将准备好的、对应的数值写到P0口。这其实就是“数组的使用”了。请读者认真阅读图2-16所示的控制程序,并下载验证,观察执行效果。
图2-16 模式4控制程序(数组法)
图2-16所示的控制程序,涉及数组的定义、数组的引用等基本知识。下面我们一起来学习。
2.2.6.1 数组的定义
数组是一组有序数据的集合,数组中的每一个数据都属于同一种数据类型。前文反复强调:C语言要使用必先定义或声明。数组也一样,必须先定义,然后才能使用。
一维数组的定义形式如下:
数据类型[存储器类型]数组名[常量表达式]={常量表达式表};
其中,用中括号“[]”括起来的表示非必要项,可以没有。
“数据类型”说明了数组中各个元素的类型,如图2-16中的数据类型为“unsigned char”,说明该数组中的所有元素都是“无符号字符型”的,其范围限制在0~255(对应十六进制0x00~0xff)。
“数组名”是整个数组的标识符,用户自己命名,建议做到“顾名思义”。
“常量表达式”说明了数组的长度,即数组中元素的个数。常量表达式必须用方括号“[]”括起来。如果常量表达式不写,则数组的长度由后面的“常量表达式表”中的常量个数确定。
“常量表达式表”中给出各个数组元素的初值。需要特别强调的是:在定义数组时,数组初值的个数必须小于或等于数组的长度(即常量表达式),否则将会导致编译出错!
C语言对数组的初始赋值有以下几点规定。
1)可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。例如:inta[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。(www.xing528.com)
2)只能给元素逐个赋值,不能给数组整体赋值。例如给10个元素全部赋1值,只能写为:
inta[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为:
inta[10]=1;
3)不给可初始化的数组赋初值,则全部元素均为0值。
4)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:
inta[5]={1,2,3,4,5};
可写为:
inta[]={1,2,3,4,5};
“存储器类型”是一个可选项,根据应用场合而设定。如果用户期望在程序运行中可以动态修改数组的元素,则说明数组的“存储器类型”为数据存储器RAM,因为只有RAM可以随机读写,这时可不写存储器类型。如果用户期望一旦定义好数组,其所有元素的数值就固定不变,用户只可以查询,不允许修改,则可将“存储器类型”确定为程序存储器ROM,这时必须使用关键字“code”来表示。
数组的一个非常有用的功能就是查表。在程序存储器中设定一个数组后,C编译器就会在系统的存储空间开辟一个区域用于存储该数组的内容。对于字符数组而言,数据占据了存储器中一串连续的字节位置。对于其他数组,如整形(int)数组,将在存储区占据一串连续的双字节位置,依此类推。
注意:声明数组时也可以不用声明数组的存储类型,这时数组默认存放在数据存储器中。
动一动
请读者在图2-16定义的数组中,添加存储器类型为“code”,并重新编译程序,观察如图2-17所示的编译结果,并回答问题:
图2-17 编译结果
1.请解释data、xdata、code所代表的含义。
2.请对比有无“code”编译后code的数值,这说明了什么问题?
想一想
请定义一个数组,元素的数据类型为无符号字符型(unsigned char),存储空间是程序存储器(code),数组名为Table,数组的前10个元素的值分别为1~10。数组Table[4]的值是什么?
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。