前面的文章中,都是介绍单个数据变量的使用,在“走马灯”等的例子中略有使用到数组,不难看出,数组不过就是同一类型变量的有序集合。形象的能这样去理解,就像一个 学校在操场上排队,每一个级代表一个数据类型,每一个班级为一个数组,每一个学生就是 数组中的一个数据。数据中的每个数据都能用唯一的下标来确定其位置,下标能是一维 或多维的。就如在学校的方队中要找一个学生,这个学生在 i 年级 h 班 x 组 y 号的,那么 能把这个学生看做在 i 类型的 h 数组中(x,y)下标位置中。数组和普通变量一样,要
求先定义了才能使用,下面是定义一维或多维数组的方式:
数据类型
数组名
[常量表达式];
数据类型
数组名
[常量表达式 1]...... [常量表达式 n];
“数据类型”是指数组中的各数据单元的类型,每个数组中的数据单元只能是同一数据
类型。“数组名”是整个数组的标识,命名方法和变量命名方法是一样的。在编译时系统会 根据数组大小和类型为变量分配空间,数组名能说就是所分配空间的首地址的标识。“常 量表达式”是表示数组的长度和维数,它必须用“[]”括起,括号里的数不能是变量只能是 常量。
unsigned int xcount [10]; //定义无符号整形数组,有 10 个数据单元
char inputstring [5]; //定义字符形数组,有 5 个数据单元
float outnum [10],[10];//定义浮点型数组,有 100 个数据单元
在 c 语言中数组的下标是从 0 开始的而不是从 1 开始,如一个具有 10 个数据单元的数
组 count,它的下标就是从 count[0]到 count[9],引用单个元素就是数组名加下标,如 count[1] 就是引用 count 数组中的第 2 个元素,如果错用了 count[10]就会有错误出现了。还有一点要 注意的就是在程序中只能逐个引用数组中的元素,不能一次引用整个数组,但是字符型的数 组就能一次引用整个数组。
数组也是能赋初值的。在上面介绍的定义方式只适用于定义在内存 data 存储器使 用的内存,有的时候我们需要把一些数据表存放在数组中,通常这些数据是不用在程序中改 变数值的,这个时候就要把这些数据在程序编写时就赋给数组变量。因为 51 芯片的片内 ram 很有限,通常会把 ram 分给参与运算的变量或数组,而那些程序中不变数据则应存放在片 内的 code 存储区,以节省宝贵的 ram。赋初值的方式如下:
数据类型 [存储器类型] 数组名 [常量表达式] = {常量表达式};
数据类型 [ 存储器类型] 数组名 [ 常量表达式 1]...... [ 常量表达式 n]={{ 常量表达 式}...{常量表达式 n}};
在定义并为数组赋初值时,开始学习的朋友一般会搞错初值个数和数组长度的关系,而致使 编译出错。初值个数必须小于或等于数组长度,不指定数组长度则会在编译时由实际的初值 个数自动设置。
unsigned char lednum[2]={12,35}; //一维数组赋初值
int key[2][3]={{1,2,4},{2,2,1}}; //二维数组赋初值
unsigned char iostr[]={3,5,2,5,3}; //没有指定数组长度,编译器自动设置
unsigned char code skydata[]={0x02,0x34,0x22,0x32,0x21,0x12}; //数据保存在 code 区
下面的一个简单例子是对数组中的数据进行排序,使用的是冒泡法,一来了解数组的使 用,二来掌握基本的排序算法。冒泡排序算法是一种基本的排序算法,它每次顺序取数组中 的两个数,并按需要按其大小排列,在下一次循环中则取下一次的一个数和数组中下一个数 进行排序,直到数组中的数据全部排序完成。
#include
#include
void taxisfun (int taxis2[])
{
unsigned char tempcyca,tempcycb,temp;
for (tempcyca=0; tempcyca<=8; tempcyca++)
for (tempcycb=0; tempcycb<=8-tempcyca; tempcycb++)
{//tempcycb<8-tempcyca 比用 tempcycbtaxis2[tempcycb]) //当后一个数大于前一个 数
{
temp = taxis2[tempcycb]; //前后 2 数交换
taxis2[tempcycb] = taxis2[tempcycb+1];
taxis2[tempcycb+1] = temp; //因函数参数是数组名调用形
参的变动影响实参
}
}
}
void main(void)
{
int taxis[] = {113,5,22,12,32,233,1,21,129,3};
char text1[] = {source data:}; //源数据
char text2[] = {sorted data:}; //排序后数据
unsigned char tempcyc;
scon = 0x50; //串行口方式 1,允许接收
tmod = 0x20; //定时器 1 定时方式 2
tcon = 0x40; //设定时器 1 开始计数
th1 = 0xe8; //11.0592mhz 1200 波特率
tl1 = 0xe8; ti = 1;
tr1 = 1; //启动定时器
printf(%s\n,text1); //字符数组的整体引用
for (tempcyc=0; tempcyc<10; tempcyc++)
printf(%d ,taxis[tempcyc]);
printf(\n----------\n);
taxisfun (taxis); //以实际参数数组名 taxis 做参数被函数调用
printf(%s\n,text2);
for (tempcyc=0; tempcyc0x20) //若到达字串尾则退出
{
if (x <= 0xf) //x 坐标应小于 0xf
{
displayonechar(x, y, ddata[listlength]); //显示单个字符
listlength++; x++;
}
}
}
//5ms 延时
void delay5ms(void)
{
unsigned int tempcyc = 5552;
while(tempcyc--);
}
//400ms 延时
void delay400ms(void)
{
unsigned char tempcyca = 5; unsigned int tempcycb; while(tempcyca--)
{
安森美半导体高能效智能电表电源方案
苹果新两项专利 为用户提高键盘的打字体验
将数字硬件与模拟模块整合到单个芯片中
关于SiGe HBT 技术和应用的未来分析和介绍
计量型低压电流互感器设计与应用
第十五课 C51数组的使用
水电预付费云平台解决方案
艾迈斯半导体携手Senova启动COVID-19(SARS-CoV-2)抗体数字快速检测套件生产线
德州仪器推出业界首款支持SPICE模型的 SAR ADC
索尼PS VR今年预期销量居首 价格低是主导因素
从芯片到应用,LoRa产业正在高速发展
2018年5月28日 | 周一 | 区块链早报
小米6X拍照怎么样 索尼全家桶发挥不俗
红外传感器单片机如何链接以及红外传感器的相关要求
京东方联合TUV莱茵发布护眼显示标准,树行业新标杆
魅族Pro7玩什么?新机不是三星也不是联发科处理器
AI视觉技术在智能边缘加速落地
光纤光缆市场需求大涨,光纤熔接机市场该如何抢夺市场,占领先机
AR解决方案商的春天来了?
小批量生产手板模型为工业级制造应用带来低成本轻量级解决方案