欢迎光临MCUWAY! 本站网名:单片机之路  永久域名:www.mcuway.com

设为首页

加入收藏

电子基础 初学MCU 单片机类型 MCU程序 MCU应用 设计软件 测控电路 技术论坛
 您现在的位置: 单片机之路 >> 初学MCU >> 单片机语言 >> 文章正文

第十五课 C51数组的使用

    前面的文章中,都是介绍单个数据变量的使用,在“走马灯”等的例子中略有使用到数组,不难看出,数组不过就是同一类型变量的有序集合。形象的能这样去理解,就像一个 学校在操场上排队,每一个级代表一个数据类型,每一个班级为一个数组,每一个学生就是 数组中的一个数据。数据中的每个数据都能用唯一的下标来确定其位置,下标能是一维 或多维的。就如在学校的方队中要找一个学生,这个学生在 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 比用 TempCycB<=8 少用很多循环

if (taxis2[TempCycB+1]>taxis2[TempCycB]) //当后一个数大于前一个 数

{

Temp = taxis2[TempCycB]; //前后 2 数交换

taxis2[TempCycB] = taxis2[TempCycB+1];

taxis2[TempCycB+1] = Temp; //因函数参数是数组名调用形 mcu way  .com

参的变动影响实参

}

}

}

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; TempCyc<10; TempCyc++) //调用后 taxis 会被改变

printf("%d ",taxis[TempCyc]);


while(1);

}

例子中能看出,数组同样能作为函数的参数进行传递。数组做参数时是用数组名进行传递的,一个数组的数组名表示该数组的首地址,在用数组名作为函数的调用参数时,它 的传递方式是采用了地址传递,就是将实际参数数组的首地址传递给函数中的形式参数数 组,这个时候实际参数数组和形式参数数组实际上是使用了同一段内存单元,当形式参数数组在 函数体中改变了元素的值,同时也会影响到实际参数数组,因为它们是存放在同一个地址的。 上面的例子同时还使用到字符数组。字符数组中每一个数据都是一个字符,这样一个一 维的字符数组就组成了一个字符串,在 C 语言中字符串是以字符数组来表达处理的。为了 能测定字符串的长度,C 语言中规定以‘\o’来做为字符串的结束标识,编译时会自动在字 符串的最后加入一个‘\o’,那么要注意的是如果用一个数组要保存一个长度为 10 字节的字 符串则要求这个数组至少能保存 11 个元素。‘\o’是转义字符,它的含义是空字符,它的 ASCII 码为 00H,也就是说当每一个字符串都是以数据 00H 结束的,在程序中操作字符数 据组时要注意这一点。字符数组除了能对数组中单个元素进行访问,还能访问整个数组, 其实整个访问字符数组就是把数组名传到函数中,数组名是一个指向数据存放空间的地址指 针,函数根据这个指针和‘/o’就能完整的操作这个字符数组。对于这一段所说的,能 参看下面一例 1602LCD 显示模块的驱动演示例子进行理解。这里要注意就是能用单个字符数组元素来进行运算,但不能用整个数组来做运算,因为数组名是指针而不是数据。

[1] [2] [3] 下一页

普通文章28课:单片机音乐汇编程序设计
普通文章27课:单片机的一些基本概念
普通文章26课:单片机矩阵式键盘接口技术
普通文章c51单片机c语言教程介绍
普通文章第一课 建立你的第一个KeilC51项目
普通文章第二课 HEX文件的生成和MCU最小系统
普通文章第三课 C51语言的数据类型
普通文章第四课 C51常量
普通文章第五课 C51变量
普通文章第六课 C51运算符和表达式
普通文章第七课 运算符和表达式(关系运算符)
普通文章第八课 运算符和表达式(位运算符)
普通文章第九课 C51运算符和表达式(指针和地址
普通文章第十课 C51表达式语句及仿真器
普通文章第十一课 C51复合语句和条件语句
普通文章第十二课 C51开关分支语句
普通文章第十三课 C51循环语句
普通文章第十四课 C51函数
普通文章第十五课 C51数组的使用
普通文章第十六课 C51指针的使用
普通文章第十七课 C51结构、联合和枚举的使用
普通文章附录-运算符优先级和结合性等
普通文章单片机之路教你学会使用Keil软件
普通文章单片机之路教你学会使用Keil软件(续
普通文章单片机之路教你学会使用Keil软件(续

  • 上一篇文章:
  • 下一篇文章:
  • 更多精彩内容>>>

    普通文章电流单位
    普通文章功率单位
    普通文章什么是达林顿管?
    普通文章晶闸管的作用与原理

    学习单片机的必经之路——单片机之路,永久域名:www.mcuway.com