完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
数组是由具有相同类型的数据元素组成的有序集合。数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题。数组与普通变量一样,也必须先定义,后使用。数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。下面就对数组进行详细的介绍。 (1)一维数组 一维数组是最简单的数组,用来存放类型相同的数据。数据的存放是线性连续的。 用以下例程说明数组的建立、数据操作: [size=#]#include [size=#]unsigned char array[10];//定义一个有10个单元的数组 [size=#]void main() [size=#]{ [size=#]unsigned char i; [size=#]for(i=0;i<10;i++) [size=#]{ [size=#]array=i; //用下标调用数组中的元素 [size=#]} [size=#]while(1); [size=#]} 数组名是用来表示数组的标识,其实它是数组的首地址,即一个指针。不过它所表示的地址是固定的,不能改动。如前几章所述的相关内容,array[2]与*(array+2)是等效的,不过不能用array++,因为array是常量。 上面[size=#]的程序中的数组是静态建立的,以下例程来用说明数组的动态建立。 [size=#]#include [size=#]#include [size=#]unsigned char *parray; [size=#]void main() [size=#]{ [size=#]unsigned char i; [size=#]parray=(unsigned char *)malloc(10); //动态创建一个数组 [size=#]for(i=0;i<10;i++) [size=#]{ [size=#]parray=i; //向数组中赋值 [size=#]} [size=#]free(parray); //释放数组 [size=#]while(1); [size=#]} [size=#]字符串是数组的一个重要特例。它的每个单元的数据均为字符类型(char),最后一个单元为' '(0x00[size=#]),用来表示字符串的结束。C51函数库中提供了专门对字符串进行处理的函数,用以下例程说明: [size=#]#include [size=#]#include [size=#]char s[]={'y','a','h','o','o',' '}; [size=#]//定义一个字符串,并对它进行初始化,以' '结束 [size=#]void main() [size=#]{ [size=#]char s_temp[10]; [size=#]strcpy(s_temp,s);//strcpy位于string.h头文件中,实现字符拷贝 [size=#]//s为一个常量,不能s++ [size=#]strcpy(s_temp,"yahoo");//与上面的语句等效 [size=#]while(1); [size=#]} [size=#]以下列出几种字符串的灵活用法,希望能够帮助读者深入了解字符串: [size=#]#include [size=#]#include [size=#]char *get_sub_string(char *s,unsigned char n) [size=#]{ [size=#]int i;int d=0;int fore=0; [size=#]int len=strlen(s); [size=#]for(i=0;i< FONT> [size=#]{ [size=#]if(s==',') [size=#]{ [size=#]s=' '; [size=#]d++; [size=#]if(d==n) [size=#]{ [size=#]return s+fore; [size=#]} [size=#]else [size=#]{ [size=#]fore=i+1; [size=#]} [size=#]} [size=#]} [size=#]return NULL; [size=#]} [size=#]void main() [size=#]{ [size=#]unsigned char c; [size=#]char string[20]; [size=#]c="yahoo"[2]; //c='h' [size=#]strcpy(string,"123,234,345,456"); [size=#]strcpy(string,get_sub_string(string,2)); [size=#]while(1); [size=#]} [size=#](2)二维数组 [size=#]可由两个下标确定元素的数组就称为二维数组。其定义的一般形式为: 类型说明符 数组名[常量表达式1][常量表达式2] 例如:int array[6][4]; 定义了一个二维数组array,有6行4列,共24个元素。 两个方括号中的常量表达1与常量表达式2规定了数组的行数与列数,从而确定了数组中的元素个数。行下标从0开始,最大为5,共6行;列下标也从0开始,最大为3,共4列。数组中共有6X4=24个元素,具体如下表示:
实际使用时,可以把上述二维数组看作一个6行4列的矩阵,是一个平面的二维结构。那么编译程序是如何用一[size=#]维的存储空间给这样一个二维结构分配连续的存储单元的呢[size=#]C51采用按行存放的方法,即在内存中先存放第0行元素,再存放第1行、第2行、......元素,每行中先存放第0列,接着存放第1列、第2列、......的元素。 [size=#]#include [size=#]#include [size=#]void main() [size=#]{ [size=#]unsigned char arrays[3][3]={{1,2,3},{2,3,4},{3,4,5}}; [size=#]//定义一个3行3列的二维数组,其它在内存中还是以一维的方式存储的 [size=#]//用下面的方式就可以知道这一点 [size=#]unsigned char test; [size=#]test=((unsigned char *)arrays)[6];//test=3; [size=#]//将二维数据的首地址强制转为一维数组,按照一维数组的方式访问它 [size=#]while(1); } [size=#]除了一维数组、二维数组,其实可以定义任何维的数组,多维数组用来表示由多个下标才能决定的量。 [size=#]例如:int arrays[3][3][3] [size=#]表示数组arrays为一个三维数组,对应于三维存储模型。 [size=#]其实单片机内的存储器是一维的,即所有数据都是依次顺序存储的,所以无论几维数组都由编译程序抽象出数组到单片机存储的实际的一维数组映射。 [size=#]#include [size=#]void main() [size=#]{ [size=#]unsigned char test; [size=#]unsigned char arrays[2][2][2]={{{1,2},{2,3}},{{3,4},{4,5}}}; [size=#]test=arrays[1][1][0];//test=4 [size=#]test=((unsigned char *)arrays)[7]; //test=5 [size=#]while(1); [size=#]} [size=#](3)结构数组 [size=#]多个结构变量也可以构成结构数组,其定义方法与定义结构变量完全相同。 [size=#]如下例: [size=#]#include [size=#]typedef struct [size=#]{ [size=#]int a,b,c,d; [size=#]} Stru; [size=#]void main() [size=#]{ [size=#]Stru stru[10]; //定义结构数组 [size=#]unsigned char i=0; [size=#]for(;i<10;i++) [size=#]{ [size=#]stru.a=i; [size=#]stru.b=i; [size=#]stru.c=i; [size=#]stru.d=i; [size=#]} [size=#]while(1); } |
|||
相关推荐 |
|||
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
952 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
469 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之开发板测试
400 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-网络编程示例之网络socket程序编程
933 浏览 0 评论
飞凌嵌入式-ELFBOARD-RGB LCD屏接口的PCB设计要点
920 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11729 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-18 00:14 , Processed in 0.588291 second(s), Total 39, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号