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

发布者:gamma13最新更新时间:2011-10-11 关键字:单片机  C语言  数组 手机看文章 扫描二维码
随时随地手机看文章

数组是由具有相同类型的数据元素组成的有序集合。数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定。引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题。数组与普通变量一样,也必须先定义,后使用。数组在C51语言的地位举足轻重,因此深入地了解数组是很有必要的。下面就对数组进行详细的介绍。

(1)一维数组

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

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

#include

/*

-----------------------------------------------------

此程序用以说明数组的建立、数据操作

-----------------------------------------------------

*/

 

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

 

void main()

{

unsigned char i;

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

{

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

}

/*

---------------------------------------

array |9|8|7|6|5|4|3|2|1|0| [9]~[0]

---------------------------------------

*/

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);

}[page]

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

 

#include

#include

/*

-----------------------------------------------------

此程序用以说明字符串的灵活运用

-----------------------------------------------------

*/

 

/*

-----------------------------------------------------

此函数从字符串s中提取第n个子串,子串间由','分隔

返回指向该子串的指针

-----------------------------------------------------

*/

 

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

{

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'

/*正如前面所述,字符串是由字符串的首地址来表示的,

字符串"yahoo"其实就是它的首地址,那就可以这样来

取其中的某个字符:"yahoo"[2]*/

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);

}[page]

 

(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语言中数组的用法

上一篇:基于MSP43O单片机的家用烟雾报警器的设计
下一篇:MN101EF32D单片机实现示波法测量血压

推荐阅读最新更新时间:2024-03-16 12:43

用51单片机模拟IIC通信
在 之前的MCS-51系列单片机中内部没有IIC通信资源,所如果要想用51单片机实现IIC通信,就只能通过软件模拟其时序,这样也能实现IIC通信的功 能。如下程序是我用Protues仿真IIC通信的结果,希望对大家有用,非常希望有共同爱好的朋友,多给我提出些宝贵的意见,至诚感谢! 这个是IIC的头文件,便于使用调用: #ifndef _IIC_H_ #define _IIC_H_ /***ucahr和uint 的宏定义很重要,否则下面的函数无法正常运行******/ #define uchar unsigned char //定义uchar型数据为无符号型 #define uint unsigned int //定义uint
[单片机]
单片机的内存分配详解
对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM、RAM启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。 通常,对于栈生长方向向下的单片机,其内存一般模型是: 一个进程运行时,所占用的内存,可以分为如下几个部分: 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。 3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程
[单片机]
德州仪器推出新型MSP430™微控制器 功能多达25项
德州仪器(TI)近日发布了用于传感应用的超值超低功耗MSP430™微控制器(MCU)。现在,开发人员可通过MSP430超值传感系列MCU中的各种集成混合信号功能实现简单的传感解决方案。该系列新增产品还包括两款新型入门级器件和一款新型TI LaunchPad™开发套件,可帮助用户快速轻松地进行评估。有关MSP430超值传感系列MCU的更多信息,请参见 http://www.ti.com/ValueLine-pr-cn 。 TI MSP430超值传感系列MCU的特点和优点 开发人员现在可以使用代码示例库灵活定制25个常用系统级功能,包括定时器、输入/输出扩展器、系统复位控制器、电可擦除可编程只读存储器(EEPROM)等。
[半导体设计/制造]
基于多MCU的自动测试诊断系统的设计
摘要:详细介绍了基于多P89C668单片机的组合逻辑电路自动测试诊断系统的设计,包括硬件结构设计和软件设计。该自动测试诊断系统采用USB接口实现计算机与诊断平台的通信,其移动式结构便于在现场进行测试,且设备成本低、操作简单。 关键词:自动测试诊断系统 多单片机 P89C668 USB 随着IT产业和通信技术、电子技术、计算机技术的高速发展,大量的生产装备和产品的电子化、数字化、自动化、智能化的程度越来越高,与之配套的电子测量设备必须适应这种形势。因此,综合测量技术、电子技术、自动化技术和计算机技术于一体的自动测试系统发展日益完善,在一些高度电子化产品、航空航天和军用武器装备中以及工业自动化、通信、光学、能源等诸多领域中得到了广
[单片机]
意法半导体(ST)推出STM32数控电源微控制器
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)推出最新的数控电源微控制器(STM32F334),为推动数字经济增长的云计算技术进一步提高能效。 今天的数字基础设施耗电量巨大。在全球大约286,000千兆瓦时(GWh) 的年用电量中,仅数字中心一种产业就占据约1.3%。根据Uptime Institute机构的能源利用率(PUE, Power Usage Effectiveness)估算报告称,在全球用电量中,只有大约40%的电能用于生产活动,而其余的电能主要是以热量的形式被损耗掉,甚至排除这些热量还需要运行大型昂贵的制冷系统(cooling
[单片机]
PIC单片机AD通道转换函数问题解析
  AD转换   D转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。   A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。   AD转换分类   1)积分型(如TLC7135)   积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。其优点是用简单电路就能获得高分辨率, 但缺点是由于转换精度
[单片机]
PIC<font color='red'>单片机</font>AD通道转换函数问题解析
航顺芯片车规MCU快速扩张,加快布局高阶汽车应用
随着汽车产业朝着电动化和 智能化 趋势推进,车规 MCU 的市场需求持续增长。尤其是电动汽车,每一个功能实现都需要复杂的 芯片 方案支撑——例如汽车门窗控制、倒车 刹车辅助系统 、汽车空调、倒车 雷达 、多媒体信息娱乐等功能的控制。 全球车规级MCU芯片行业发展历程(资料来源:前瞻产业研究院) 作为头部MCU厂商,航顺芯片制定了车规SoC+高端MCU超市双战略,基于自身32位MCU研发实力,加速航顺车规SoC的产品布局,实现在 汽车电子 领域的快速扩张。 2021年~2023年航顺芯片陆续先后推出车规SoC产品:HK32AUTO39A和HK32A040系列,并成功进入车规级 微控制器 市场,在东南、东风、中兴、金康、柳
[汽车电子]
航顺芯片车规<font color='red'>MCU</font>快速扩张,加快布局高阶汽车应用
单片机AT89S52实现DTMF信号译码
   引言   DTMF信号首先用于电话的拨号系统,在频率编码遥控系统及数据编码传输中的应用也很普遍。目前的DTMF译码器中,大多采用通用集成器件(单音译码电路和组合门电路)或专用DTMF信号译码集成电路(如MC145436等)组成译码电路。在很多情况下,DTMF译码器输出的数据仍需送入单片机进行相应的运算及处理,进而控制其它各种设备的动作。因此,如果能找到一种基于单片机的DTMF信号的译码算法,再辅之以简单的整形电路就可以,既可省去成套译码电路,又能达到简化电路降低成本的目的。本文所要介绍的,就是这种构想的初衷,结果通过计算机仿真计算数据论证认为完全能够达到设计要求。    1、DTMF信号频率组成及整形前DTMF信号的幅值
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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