单片机的C语言中数组的用法

发布者:Yuexiang888最新更新时间:2016-01-15 来源: eefocus关键字:单片机  C语言  数组 手机看文章 扫描二维码
随时随地手机看文章
数组是由具有相同类型的数据元素组成的有序集合。数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题。数组与普通变量一样,也必须先定义,后使用。数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。下面就对数组进行详细的介绍。

(1)一维数组

一维数组是最简单的数组,用来存放类型相同的数据。数据的存放是线性连续的。

用以下例程说明数组的建立、数据操作:

#include

 

unsigned char array[10];//定义一个有10个单元的数组

 

void main()

{

unsigned char i;

for(i=0;i<10;i++)

{

array[i]=i; //用下标调用数组中的元素

}

 

while(1);

}

数组名是用来表示数组的标识,其实它是数组的首地址,即一个指针。不过它所表示的地址是固定的,不能改动。如前几章所述的相关内容,array[2]与*(array+2)是等效的,不过不能用array++,因为array是常量。

上面的程序中的数组是静态建立的,以下例程来用说明数组的动态建立。

#include

#include

 

 

 

unsigned char *parray;

 

void main()

{

unsigned char i;

parray=(unsigned char *)malloc(10); //动态创建一个数组

for(i=0;i<10;i++)

{

parray[i]=i; //向数组中赋值

}

free(parray); //释放数组

while(1);

}

字符串是数组的一个重要特例。它的每个单元的数据均为字符类型(char),最后一个单元为''(0x00),用来表示字符串的结束。C51函数库中提供了专门对字符串进行处理的函数,用以下例程说明:

#include

#include

 

 

 

char s[]={'y','a','h','o','o',''};

//定义一个字符串,并对它进行初始化,以''结束

 

void main()

{

char s_temp[10];

strcpy(s_temp,s);//strcpy位于string.h头文件中,实现字符拷贝

//s为一个常量,不能s++

strcpy(s_temp,"yahoo");//与上面的语句等效

while(1);

}

以下列出几种字符串的灵活用法,希望能够帮助读者深入了解字符串:

#include

#include

 

 

 

 

char *get_sub_string(char *s,unsigned char n)

{

int i;int d=0;int fore=0;

int len=strlen(s);

for(i=0;i< FONT>

{

if(s[i]==',')

{

s[i]='';

d++;

if(d==n)

{

return s+fore;

}

else

{

fore=i+1;

}

}

}

return NULL;

}

 

void main()

{

unsigned char c;

char string[20];

c="yahoo"[2]; //c='h'

 

strcpy(string,"123,234,345,456");

strcpy(string,get_sub_string(string,2));

while(1);

}

(2)二维数组

可由两个下标确定元素的数组就称为二维数组。其定义的一般形式为:

类型说明符 数组名[常量表达式1][常量表达式2]

例如:int array[6][4];

定义了一个二维数组array,有6行4列,共24个元素。

两个方括号中的常量表达1与常量表达式2规定了数组的行数与列数,从而确定了数组中的元素个数。行下标从0开始,最大为5,共6行;列下标也从0开始,最大为3,共4列。数组中共有6X4=24个元素,具体如下表示:

array[0][0]

array[0][1]

array[0][2]

array[0][3]

array[1][0]

array[1][1]

array[1][2]

array[1][3]

array[2][0]

array[2][1]

array[2][2]

array[2][3]

array[3][0]

array[3][1]

array[3][2]

array[3][3]

array[4][0]

array[4][1]

array[4][2]

array[4][3]

array[5][0]

array[5][1]

array[5][2]

array[5][3]

实际使用时,可以把上述二维数组看作一个6行4列的矩阵,是一个平面的二维结构。那么编译程序是如何用一维的存储空间给这样一个二维结构分配连续的存储单元的呢C51采用按行存放的方法,即在内存中先存放第0行元素,再存放第1行、第2行、......元素,每行中先存放第0列,接着存放第1列、第2列、......的元素。

#include

#include

 

 

 

void main()

{

unsigned char arrays[3][3]={{1,2,3},{2,3,4},{3,4,5}};

//定义一个3行3列的二维数组,其它在内存中还是以一维的方式存储的

//用下面的方式就可以知道这一点

unsigned char test;

test=((unsigned char *)arrays)[6];//test=3;

//将二维数据的首地址强制转为一维数组,按照一维数组的方式访问它

while(1);

}

除了一维数组、二维数组,其实可以定义任何维的数组,多维数组用来表示由多个下标才能决定的量。

例如:int arrays[3][3][3]

表示数组arrays为一个三维数组,对应于三维存储模型。

其实单片机内的存储器是一维的,即所有数据都是依次顺序存储的,所以无论几维数组都由编译程序抽象出数组到单片机存储的实际的一维数组映射。

 

#include

 

 

 

void main()

{

unsigned char test;

unsigned char arrays[2][2][2]={{{1,2},{2,3}},{{3,4},{4,5}}};

test=arrays[1][1][0];//test=4

test=((unsigned char *)arrays)[7]; //test=5

while(1);

}

(3)结构数组

多个结构变量也可以构成结构数组,其定义方法与定义结构变量完全相同。

如下例:

#include

 

 

 

typedef struct

{

int a,b,c,d;

} Stru;

 

void main()

{

Stru stru[10]; //定义结构数组

unsigned char i=0;

for(;i<10;i++)

{

stru[i].a=i;

stru[i].b=i;

stru[i].c=i;

stru[i].d=i;

}

while(1);

}

关键字:单片机  C语言  数组 引用地址:单片机的C语言中数组的用法

上一篇:单片机内部存储结构分析
下一篇:单片机常用输出格式--Hex-80(Hex 386)

推荐阅读最新更新时间:2024-03-16 14:44

C语言嵌入式系统编程修炼之一:背景篇!
不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,C语言--一种 高级的低级 语言,则成为嵌入式系统开发的最佳选择。笔者在嵌入式系统项目的开发过程中,一次又一次感受到C语言的精妙,沉醉于C语言给嵌入式开发带来的便利。   图1给出了本文的讨论所基于的硬件平台,实际上,这也是大多数嵌入式系统的硬件平台。它包括两部分:   (1)以通用处理器为中心的协议处理模块,用于网络控制协议的处理;   (2)以数字信号处理器(DSP)为中心的信号处理模块,用于调制、解调
[单片机]
<font color='red'>C语言</font>嵌入式系统编程修炼之一:背景篇!
C51编程总结-单片机的奇怪知识1(IC输入输出电压)
在使用单片机中过程,我们肯定对数字信号的“0”与“1”,有了深刻的影响,一般来说高电平位“1”为5V(对于5V VCC的单片机来来说),低电平“0”是0V。 实际上我们可能使用供电电压3.3V的芯片,高电平“1”的电压是3.3V。使其与单片机进行交换数据,,这个时候5V单片机能够正常识别到3.3V芯片的 “1”吗? 3.3V芯片与5V单片能不能正常交换数据 IC输入输出电压(也常被成为I/O识别电压),不是看VCC。而是看输入输出电压 我们可以在IC的规格书上查看到相关的参数。以下是CH340部分电气参数。 从表格可以知道,相关输入输出电压有四个参数,分别是 注:看输入输出电压,需要看两个芯片的输入输出电压,
[单片机]
C51编程总结-<font color='red'>单片机</font>的奇怪知识1(IC输入输出电压)
使用8051单片机在LCD屏幕上显示内容的教程
液晶显示器(LCD)是一种常用的显示屏,在许多电子产品中经常使用它来以文本或图像格式显示信息。LCD用于在其屏幕上显示字母、数字等字符。LCD显示器由8条数据线和3条控制线组成,用于将LCD显示器与8051单片机连接。 考虑使用基于Proteus的模拟LCD与8051单片机的接口是: 如何在LCD显示屏上显示“8051单片机”,案例程序如下: #include reg51.h #define kam P0 void lcd_initi(); void lcd_dat(unsigned char ); void lcd_cmd(unsigned char ); void delay(); void di
[单片机]
使用8051<font color='red'>单片机</font>在LCD屏幕上显示内容的教程
AT89S51单片机对数字电压表的设计
利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。 1. 电路原理图 图1.28.1 2. 系统板上硬件连线 a) 把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 b) 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。 c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。 d) 把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。 e) 把“单片机系
[单片机]
AT89S51<font color='red'>单片机</font>对数字电压表的设计
51单片机还适合作为初学者入门的单片机吗?
对于很多初学者来说考虑要不要从51单片机入门是个挺头疼的问题。毕竟现在许多公司已经不用51单片机做产品了。但是51单片机流行了这么久,它肯定是一款很经典的产品。我以前也是从51开始学的。 我个人的建议是从51单片机作为入门是一个非常不错的选择。大多数的从业者都是以51单片机作为起点的。下面就具体说说我推荐51作为入门的具体原因。 容易入门 我们作为初学者脑海里可能没有单片机的概念,如果我们入门以STM32或者STM8S这类单片机来入门的话,作为初学者我们会感到迷茫无从下手。STM32这类的单片机内容会比较多,一开始就要了解单片机的方向寄存器还要了解单片机的数据寄存器,甚至还有库函数,太多的知识涌入进来,一时间让初学
[单片机]
基于SRAM的微控制器优化了安全性
结果表明,非易失性(NV)SRAM是用于存储安全数据的最安全的存储器。通过使用 DES 或三重 DES 加密内存,可以建立加密边界,使安全信息不被黑客渗透。通过使用防篡改反应传感器,可以进一步保护SRAM的易失性,这些传感器将擦除加密密钥作为响应。密码键盘等金融应用依靠自动程序和数据存储器加密功能来保护数据。DS5250是一款高性能、安全的8051微控制器,利用安全SRAM的独特特性来保护敏感数据。 无论是在自动取款机、护照/身份验证设备还是便利店的销售点终端中,都必须保护密码、个人识别码 (PIN)、加密密钥和专有加密算法等关键信息免受黑客攻击。金融服务采用详细的政策和程序来保护硬件和软件。因此,金融交易系统的设计者在开发每
[单片机]
基于SRAM的<font color='red'>微控制器</font>优化了安全性
零基础学习单片机切记这四点要求,少走弯路
其中一种,其它的都可以触类旁通,快速上手了。如果你这些条件都没有,那就跟着我学吧,我建议你学习51 单片机。 为什么要学习51单片机: 虽然现在单片机种类和型号非常多,每个型号都有一定的市场份额,但是哪个型号也没有早期 51单片机那般风光和火爆,虽然现在地位不是那么高了,但是因为 51 单片机积累的资料非常多,大家学起来就会拥有众多的参考资料,所以上手肯定比其他型号的要快一些。如果你学习稍微偏门的单片机,可能一个简单的软件问题就 要折腾你好长时间,不仅仅浪费了你的学习时间,更重要的是打击了学习单片机的信心。 那么是不是每种单片机我们都要学一遍呢?答案当然是否定的。大家跟着我来学习 51单片机,必须得跟着学会举一反三和融会贯通的能力
[单片机]
基于单片机的高速信号测试接口板的实现
  在数字电路设计和调试中,对设计单元电路的性能进行实时测试是必不可少的环节。很多情况下,需要通过计算机的比较和分析,来测试设计的电路的性能是否达到要求。这就需要设计一个测试接口板,将计算机产生的测试数据送入单元电路,再将单元电路的输出结果送回计算机。   在电路测试接口板的设计过程中,常常会遇到总线时钟频率较高(如40 MHz以上)、总线宽度较宽(如36 b)、要求测试的数据量较大(几Mb/s)的单元电路。这时实时地进行数据的双向传输比较困难,因为不论采用总线频率较高的PCI数据总线或USB总线[1],都达不到系统要求的数据传输速率,所以必须进行数据的缓存。考虑到PCI总线和USB总线的接口电路复杂、开发周期长,本文介绍一种采
[单片机]
基于<font color='red'>单片机</font>的高速信号测试接口板的实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved