《(6.3)--3.4 C51数组单片机原理与应用.ppt》由会员分享,可在线阅读,更多相关《(6.3)--3.4 C51数组单片机原理与应用.ppt(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机单片机的的C51C51基础知识基础知识第三章第三章第第 节节3.4 3.4 C51C51的数组的数组3 3同学们好,现在我们来同学们好,现在我们来学习学习C51C51的数组的数组C51的数组简单数据类型,适合于少量数据的处理。对于批量数据的处理,使用普通变量会很不方便。例如,一个班有30名学生,怎样求30名学生的平均成绩?方法:用30个变量s0,s1,29表示每人的学习成绩,求和再除以30即可 这种做法很繁琐,如果学生人数再多怎么办?数组数组法法:将s0,s1,s29作为一组有序数据的集合一组有序数据的集合,用一个数组名s来代表它们,将s后面的编号放在方括号里代方括号里代表数据在数组中的
2、序号表数据在数组中的序号,如s14代表学生s14的成绩。将这样的数组与C51的循环功能结合起来,可以有效地处理大批量的数据。3.4.1 一维数组的定义一维数组的定义一维数组一维数组:它的元素只需要用数组名加一个下标就能唯一地确定,如上面介绍的学生成绩数组s就是一维数组。二维二维数组数组:两个下标才能唯一地确定一个元素 如用s23表示第3班第4名学生的成绩。三维甚至更多维数组,掌握一维数组后,对二维或多维数组,很容易举一反三迎刃而解C51的数组C51中定义一维数组的一般形式为:数据类型存储类型数组名数据类型存储类型数组名 常量表达式常量表达式;定义式中,数据类型、存储类型和数组名的规则与变量定义
3、规则相同。方括号里的常量表达式可以是常量表达式可以是常量常量,如“int s30;”或宏或宏(用用“#define NUM 30”语句定义过的标识符语句定义过的标识符),如“int sNUM;”。若数组定义时方括号里出现变量,一般都是不合法的,如“int sn;”但在被调用函数中定义数组时其长度可以是变量。C51的数组对前述学生成绩数组的定义:int data s30;表示定义了一个整型数组,数组名为s,数组长度为30 编译器在data存储区里划出一片大小为2x3060个字节的存储单元 注意:数组下标从0开始,故数组元素s30不存在。定义数组的同时给数组各元素赋初值(初始化)赋初值(初始化):
4、可以用“初始化列表”方式实现数组的初始化:1、在定义数组时对全部数组元素赋予初值对全部数组元素赋予初值,例如例如:int data s30=75,82,93,65;将数组中各元素的初值顺序地放在一对花括号内,数据间用逗号分隔。这些初值一一赋给各个元素s0=75,s1=82,s3=93,s29=65。2、只给数组中的一部分元素赋值只给数组中的一部分元素赋值,例如例如:int data s30=75,82,93;定义s数组有30个元素,但花括号里只提供了3个初值,这表示编译器只给前面3个元素赋初值,其余27个元素将被自动赋初值0(如果是字符型数组,则赋值为空字符,即0)。数组的初始化数组的初始化C
5、51的数组3、如果想使一个数组中全部元素初值都为全部元素初值都为0,可以写成:int data s30=0;有些编译系统对数组定义时全部没有赋初值的元素也会自动赋以0初值。例如例如:若int data a10;则a0a9全部被赋0初值。4、在对全部数组赋初值时,可以根据初始化列表中数据个可以根据初始化列表中数据个数确定数组长度数确定数组长度,例如例如:int data s=75,82,93,65;即定义时可以不指定数组的长度,而让编译器根据中的数据个数确定数组的长度。C51的数组注意注意:当程序中定义了一个数组后,程序运行时就会在存储空间中开辟一个区域用于存放该数组的内容。数组就包含在这个由连
6、续存储单元组成的存储体内。数组、特别是大型数组会占用大量的存储空间。由于51单片机存储资源十分有限,因此在进行C51编程开发时要仔细根据需要来选择数组的大小,以免造成存储空间不足问题。C51的数组3.4.2 一维数组的使用一维数组的使用两种引用数组元素的方法,即下标法和指针法即下标法和指针法。1、下标法下标法引用数组元素 一般形式是:数组名数组名下标下标;注意:定义数组时的定义数组时的“数组名数组名常量表达式常量表达式”和引用数组元素和引用数组元素时用的时用的“数组名数组名下标下标”虽然形式相同,但含义不同虽然形式相同,但含义不同。例如例如:int s30;/表示定义包含了30个元素的数组st
7、=s6;/表示引用数组s中下标为6的元素被引用的数组元素和一个简单变量的地位与作用相似。C51的数组一般来说,凡是变量可以出现的地方,都可以用数组元素代替。因此,数组元素可以出现在表达式中,也可以被赋值。例如,下面的赋值表达式包含了对数组si中具体元素的引用:s0=s5+s7-s2*3;/其中,每一个数组元素都代表一个具体的数值。C51C51的数组的数组【实例12】采用数组方法计算1019之间所有整数的平均值。对10个数组元素一次赋值为10,11,12,13,14,15,16,17,18,19,然后计算它们的算术平均值,并将结果存放到变量result中。解题分析:先定义一个长度为10的整型数组
8、a并用1019初始化。然后利用循环方式对引用的数组元素求和,累加和存入变量result中。然后再将result除以10即为平均值。由于result中可能包含小数,故应将其定义为浮点型变量。源程序如下:C51的数组源源程序程序:程序分析程序分析:for循环按result=result+ai进行求和,中间结果暂存在result中。最后将中间结果除以10后的平均值仍存入result中。注意注意:由于ai为整型元素,而result为浮点型变量,在执行result=result+ai时将出现不同数据类型的混合运算问题C51的数组 根据C51规则,一个运算符两侧的数据类型不同,要先自动进行类型转换,使二者
9、具有同一类型 类型转换的一般规律:低级别类型被转换成高级别类型,即bitcharintlongfloat。有符号数和无符号数的转换规律:unsignedsigned。实例中result+ai 前,ai的int型转换float型,然后以float型进行相加。C51的数组2、指针法引用数组元素 根据C 51的规定,将一个变量用来存放一个数组的起始地址(即数组中下标为0的元素的地址),则这个变量就是指向数组的指针变量。例如,定义一个整型数组a10和一个指向该数组的指针变量app:int a10;定义a为包含10个整型元素的数组 int*app=&a0;定义app为指向整型数组a的指针变量 变量名实际
10、上就是为变量分配的若干存储单元的首地址,数组名则是为数组分配的连续存储单元的首地址,第二条语句等价于:int*app=a;C51C51的数组的数组指针法指针法引用数组元素可用以下两种形式:*(数组指针变量名+i)数组指针变量名ii为数组元素的下标形式为经典形式经典形式形式为下标形式下标形式两者都等价于下标法引用的元素“数组名i”C51的数组实例13 利用指针法重新计算整数1019的平均值 解题分析:上例中是用循环变量i控制循环过程,在循环体中对下标引用的数组元素进行累加求和。其实,循环过程也可利用指针刷新的次数(app+)来控制,在循环体内则可对指针变量引用的数组元素(*app)进行累加求和。
11、源程序如下:C51C51的数组的数组第3章 单片机的C51基础知识3.4.3 字符数组字符数组用来存放字符型数据的数组叫做字符数组字符数组。字符数组中的一个元素存放一个字符。定义字符数组字符数组的方法与定义数值型数组数值型数组的方法类似。例如:例如:char c12=G,o,o,d,m,o,r,n,i,n,g;12个字符一次分别赋值给c0c11 12个元素。字符型数据是以整数形式(ASCII代码)存放,故也用整型数组存放字符数据。例如例如:int c12=G,o,o,d,m,o,r,n,i,n,g;编译器自动根据ASCII码将“初始化列表初始化列表”中的字符转换为整型数据字符数组初始化初始化如
12、果数组初始化时花括号中的初值个数大于数组长度初值个数大于数组长度,则会出现语法错误。如果初值个数小于数组长度初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动赋为空字符(即0)。还可以采用字符串赋值的方法字符串赋值的方法(用双引号而不是单引号引导)。例如例如:char c=”Good morning”;C51系统在处理字符串常量存储时会自动加一个0作为结束符。因此,此时数组c的长度不是12而是13。C51的数组3.4.4 二维数组二维数组二维数组的定义与一维数组相似,一般形式为:数据类型数据类型 存储类型存储类型 数组名数组名常量表达式常量表达式1 常量表达式常量表达式
13、2;例如例如:long a34;以上定义了一个long型的二维数组a,第1维有3个元素,第二维有4个元素。注意上述数组不能写成:long a3,4;C51的数组C51语言中,二维数组中元素排列的顺序是按行存放的二维数组中元素排列的顺序是按行存放的,即在存储单元中先顺序存放第1行的元素,接着再存放第2行的元素。长整型数组a34在存储单元中的存放顺序可见,若数组a的首地址为2000,一个数组元素占4个字节,前16个存储单元(20002015)存放第0行中的4个元素,接着的16个单元(20162031)存放第1行4个元素,余此类推。C51的数组二维数组初始化二维数组初始化:(1)可以分行给二维数组赋
14、初值分行给二维数组赋初值,如:long a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)可以将所有初值写在一个花括弧内,按数组排列的顺序对按数组排列的顺序对各元素赋初值各元素赋初值。如:long a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)可以对部分元素赋初值对部分元素赋初值,如:long a34=1,5,6;可以对各行中的某一元素赋初值对各行中的某一元素赋初值,如:long a34=1,0,6,0,0,11;可以只对某几行元素赋初值只对某几行元素赋初值,如:long a34=1,5,9;C51的数组 关于关于C51C51的数组讲的数组讲到到这里,这里,同同学们学们再见再见