欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    51单片机C语言应用与开发().ppt

    • 资源ID:85468504       资源大小:292.50KB        全文页数:83页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    51单片机C语言应用与开发().ppt

    51单片机C语言应用与开发第第2章章 C51程序程序设计设计 第第2章章 C51程序设计程序设计nC51程序设计语言是一种编译型程序设计语言,兼顾了许多高级语言的特点和一定的汇编语言功能。n书写格式比较自由,具有完善的模块化程序结构,语言中含有功能丰富的库函数。n具有运算速度快,编译效率高,可移植性好等优点,而且可以实现对系统硬件的直接控制。n使用C语言进行程序设计已成为目前单片机及嵌入式系统开发的主流。n本章主要介绍C51程序设计的根本方法,意在将C语言程序设计与单片机控制结合起来,为后面学习单片机控制系统的开发打下一定的根底。n本章重点本章重点nC51的数据类型位标量和可寻址位变量、特的数据类型位标量和可寻址位变量、特殊功能存放器型数据殊功能存放器型数据n变量的存储类型及定义变量的存储类型及定义n指针的定义和使用指针的定义和使用n结构的定义和使用结构的定义和使用nC51的运算符与表达式的运算符与表达式n中断效劳函数的定义和使用中断效劳函数的定义和使用n编译预处理编译预处理nC语言与汇编语言的混合编程语言与汇编语言的混合编程第第2章章 C51程序设计程序设计n本章难点本章难点n位标量的定义和可寻址位重命名的区别位标量的定义和可寻址位重命名的区别n特殊功能存放器型数据的定义和特点特殊功能存放器型数据的定义和特点n变量的存储类型及定义变量的存储类型及定义n结构体和联合体的定义和使用结构体和联合体的定义和使用nC51的特殊运算符的特殊运算符n中断效劳函数的定义和使用中断效劳函数的定义和使用n编译预处理编译预处理nC语言和汇编语言的混合编程语言和汇编语言的混合编程第第2章章 C51程序设计程序设计n本章各章节安排本章各章节安排u2.1 Keil C51u2.2 C51的数据类型u2.3 运算符与表达式u2.4 流程控制语句u2.5 函数u2.6 编译预处理u2.7 C语言和汇编语言混合编程第第2章章 C51程序设计程序设计第第2章章 C51程序设计程序设计 l2.1 Keil C51 n2.1.1 Keil C51的主要功能模块的主要功能模块uC51优化C编译器;uA51宏汇编器;u80C51工具连接器、目标文件转换器、库管理器;uWindows版dScope源程序调试器/模拟器;u Windows版Vision集成开发环境。第第2章章 C51程序设计程序设计n2.1.2 Keil C51的编程步骤的编程步骤n使用使用Keil C51编程和用其他软件开发工程时大致编程和用其他软件开发工程时大致一样,按以下步骤编程:一样,按以下步骤编程:n创立创立C或汇编语言源程序;或汇编语言源程序;n编译或汇编源文件运算符;编译或汇编源文件运算符;n纠正源文件中的错误;纠正源文件中的错误;n 连接产生目标文件;连接产生目标文件;n模拟调试用户程序。模拟调试用户程序。第第2章章 C51程序设计程序设计uKeil C51编译器在遵循ANSI标准的同时,也专为8051系列微控制器进行了特别的设计。Keil C51编译器与标准的ANSI C语言编译器相比,主要区别在于前者对C语言的扩展能让用户充分使用51单片机的所有资源。这些差异主要表现在以下几个方面:u8051的存储类型;u存储模式;u数据类型;uC51指针;u函数。u相对于ANSI 的C编译器而言,Keil C51编译器的大多数扩展功能都是直接针对8051系列微处理器的。充分理解其区别和特点、深入理解并应用C51对标准ANSI C的扩展,是学习C51的关键之一。有关Keil C51集成开发环境的具体使用将在第五章详细介绍。第第2章章 C51程序设计程序设计 l2.2 C51的数据类型的数据类型 l数据:具有一定格式的数字或数值数据:具有一定格式的数字或数值。数据是计。数据是计算机操作的对象,任何程序设计都离不开对于算机操作的对象,任何程序设计都离不开对于数据的处理。数据的处理。l数据类型数据类型:数据的不同存储格式:数据的不同存储格式。l数据结构数据结构:数据按一定的数据类型进行排列、:数据按一定的数据类型进行排列、组合、架构组合、架构,数据在计算机内存中的存放情况,数据在计算机内存中的存放情况由数据结构决定由数据结构决定。lC语言的数据结构是以数据类型出现的语言的数据结构是以数据类型出现的:包括根:包括根本类型、构造类型、指针类型以及空类型等本类型、构造类型、指针类型以及空类型等。根本类型有位根本类型有位(bit)、字符、字符(char)、整型、整型(int)、短整型短整型(short)、长整型、长整型(1ong)、浮点型、浮点型(float)以及双精度浮点型以及双精度浮点型(double)等;构造类等;构造类型包括数组型包括数组(array)、结构体、结构体(struct)、共用体、共用体(union)以及枚举类型以及枚举类型(enum)等。等。第第2章章 C51程序设计程序设计n对于单片机编程而言,支持的数据类型和编译器有关,比方在C51编译器中整型(int)和短整型(short)相同,浮点型(float)和双精度浮点型(double)相同。表21列出了C51的数据类型。第第2章章 C51程序设计程序设计nchar字符类型n字符型char分为有符号字符型signed char和无符号字符型unsigned char两种,默认值为有符号型。字符型数据长度为一个字节。有符号字符型数据字节中的最高位为符号位,“0表示正数,“1表示负数,负数用补码表示。无符号字符型数据字节中的位均用来表示数本身,而不包括符号,其数值范围为0255。nint整型n整型int同样分为有符号整型(signed int)和无符号整型(unsigned int)两种,默认值为有符号整型。整型数据长度为两个字节。nlong长整型n长整型(long)也分为有符号长整型(signed long)和无符号长整型(unsigned long)两种,默认值为有符号长整型。长整型数据长度为四个字节。第第2章章 C51程序设计程序设计nfloat浮点型n单精度浮点型(float)数据占用四个字节32位二进制数,在内存中的存放格式如下:n 其中,S为符号位,位于最高字节的最高位。“1表示负数,“O表示正数。E为阶码,占用8位二进制数,存放在两个高字节中。为了防止出现负的阶码值,阶码E值是以2为底的指数再加上偏移量127,指数可正可负。阶码E的正常取值范围为1254,那么实际指数的取值范围为126+127。M为尾数的小数局部,用23位二进制数表示,存放在三个低字节中。尾数的整数局部永远为l,因此尾数隐含存在,不予保存。小数点位于隐含的整数位“1后面。一个浮点数的数值范围是(1)S2E127(1.M)。例如:第第2章章 C51程序设计程序设计p浮点数124.75=42F94000H,在内存中的存放格式为:p需要指出的是,浮点型数据除了有正常数值之外,还可能出现非正常数值。根据IEEE标准,当浮点型数据取以下数值(16进制数)时即为非正常值:FFFFFFFFH 非数(NaN)7F800000H 正溢出(+INF)FF800000H 负溢出(INF)u另外,8051单片机不包括捕获浮点运算错误的中断向量,需要用户依据可能出现的错误条件用软件方法进行相应的处理。第第2章章 C51程序设计程序设计n*指针型n在C51中指针变量的长度一般为13个字节。指针变量也具有类型,其表示方法是在指针符号“*的前面冠以数据类型符号。如:nchar*point1,表示point1是一个字符型的指针变量;nfloat *point2,表示point2是一个浮点型的指针变量。n指针变量的类型表示该指针所指向地址中数据的类型,使用指针型变量可以方便地对8051单片机的各局部物理地址直接进行操作。nbit位标量n位标量bit是C51编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义位指针,也不能定义位数组。第第2章章 C51程序设计程序设计u位标量用关键字“bit定义,是一个二进制位。函数中可以包含bit类型的参数,函数的返回值也可以为bit型。位标量用于定义一个标量,表示某个二进制位的值,这对能直接进行位操作的80C51来说,很有实用价值。它的语法结构是:u bit 标量名;u例如:u bit flag;/定义一个位标量flag,作为程序中的一个标志位usfr特殊功能存放器u特殊功能存放器型数据sfr是C51编译器的一种扩充数据类型,利用它可以访问8051单片机内的所有特殊功能存放器。sfr型数据占用一个字节内存单元,取值范围为0255。第第2章章 C51程序设计程序设计nsfrl6n16位特殊功能存放器型数据sfr16,占用两个字节的内存单元,取值范围为065535。nsbit可寻址位 n可寻址位(sbit)是C51编译器的一种扩充数据类型,利用它可以访问8051单片机内部RAM中的可寻址位或特殊功能存放器中的可寻址位。例如:nsfr P0=0 x80;/将8051单片机的P0的口地址定义为0 x80 nsbit FLAG1=P01;/将PO.1位定义为FLAG1 nbit和sbit的主要区别是:nbit定义的是一个标量 n 而sbit是将一个的位重命名 第第2章章 C51程序设计程序设计n2.2.1 常量常量 在程序运行过程中,其值不能被改变的量称为常量。常量的数据类型有整型、浮点型、字符型和字符串型等。u1整型常量p整型常量就是整型常数,可表示为以下几种形式:十进制整数:如1234、5678、0等。十六进制整数:以0 x开头的数是十六进制数,如0 x123表示十六进制数123H,相当于十进制数291。Ox1a表示十六进制数1aH,相当于十进制数26。ANSI C标准规定十六进制数的数字为09,再加字母af。长整数:在数字后面加一个字母L就构成了长整数,如2048L、0123L、0 xffOOL等。第第2章章 C51程序设计程序设计u2.浮点型常量u浮点型常量有十进制数和指数两种表示形式。u十进制数表示形式又称定点表示形式,由数字和小数点组成。如:0.3141、.3141、314.1、3141.及0.0都是十进制数表示形式的浮点型常量。在这种表示形式中,如果整数或小数局部为0可以省略不写,但必须有小数点。u指数表示形式为;u 数字.数字e数字u 其中,为可选项,其中的内容根据具体情况可有可无,其它局部为必须项。如123e4.5e6、7.0e8等都是合法的指数形式的浮点型常量;而e9、5e4.3和e都是不合法的表示形式。第第2章章 C51程序设计程序设计u3.字符型常量u在C语言中,字符常量是用单引号括起来的单个字符。例如a,b等。对不可显示的控制字符,可以在该字符前面加一反斜杠“构成专用转义字符。转义字符可以完成一些特殊功能和输出时的格式控制。常用转义字符如表22所示。第第2章章 C51程序设计程序设计u4字符串常量u字符串型常量是由一对双引号“括起的字符序列,如“ABCD、“$1234等都是字符串常量。u当双引号内的字符个数为0时,称为空串常量。u需要注意的是,字符串常量首尾的双引号是界限符,当需要表示双引号字符串时,要使用转义字符“。如printf(“He said I am a studentn)。第第2章章 C51程序设计程序设计n2.2.3 数组数组n数组是一组具有固定数目和相同类型数组元素数组是一组具有固定数目和相同类型数组元素的有序集合,其数组元素的类型为该数组的根的有序集合,其数组元素的类型为该数组的根本类型。构成一个数组的各元素必须是同一类本类型。构成一个数组的各元素必须是同一类型的变量,不允许在同一数组中出现不同类型型的变量,不允许在同一数组中出现不同类型的变量。的变量。n数组数据是用同一个名字的不同下标访问的,数组数据是用同一个名字的不同下标访问的,例如数组例如数组ai,当,当i0,1,2,n时时a0,a1,an分别是数组分别是数组ai的元素的元素(或或成员成员)。数组有一维、二维、三维、多维数组。数组有一维、二维、三维、多维数组之分。常用的有一维、二维数组和字符数组。之分。常用的有一维、二维数组和字符数组。第第2章章 C51程序设计程序设计p变量的存储种类有四种:p自动(auto)p外部(extern)p静态(static)p存放器(registerp 在定义一个变量时如果省略存储种类选项,那么该变量将为自动(auto)变量。p变量的数据类型有:p位变量 p字符型变量 p整型变量 p浮点型变量 第第2章章 C51程序设计程序设计u变量的存储器类型u定义一个变量时除了需要说明其存储种类、数据类型之外,C51编译器还允许说明变量的存储器类型。Keil C51编译器完全支持8051系列单片机的硬件结构,可以访问其硬件系统的所有局部。对每个变量可以准确地赋予其存储器类型,从而可使其能在单片机系统内准确地定位。存储类型与8051单片机实际存储空间的对应关系如表23所示。第第2章章 C51程序设计程序设计code存储器类型对应64KB程序存储器空间。程序存储器是只读不写的,如果将变量定义成code存储器类型,那么这个变量的值只能允许访问和引用,不能修改。该存储空间除存放程序语句的机器码外,还可存储各种查寻表。C51程序中将变量定义为code存储器类型,可以完成与汇编语言相同的功能。data存储器类型定义的变量存储在内部RAM的低128字节地址空间。data存储器类型对应的空间主要用作数据区。该存储区内,指令用一个或两个周期来访问数据,在所有区内访问中速度最快。通常将使用较频繁的变量、局部变量或用户自定义变量存储在data区。bdata存储器类型对应的空间称为位寻址区,即bdata区。该区的范围是从片内RAM地址20H开始到2FH结束,包括16字节,共128个可以寻址的位,每一位都可单独操作。80C51有17条位操作指令,程序控制非常方便,并且有助于软件代替外部组合逻辑。位寻址区的这16字节也可以进行字节寻址。第第2章章 C51程序设计程序设计使用xdata存储类型定义常量、变量时,C51编译器会将其定位在外部数据存储空间(片外RAM),该空间位于片外附加的8K、16K,32K或64K RAM芯片中,其最大寻址范围为64K。要使用外部数据区信息时,需用指令将其移动到内部数据区,数据处理完成后,结果再返回到片外数据存储区。片外数据存储区主要用于存放不经常使用的变量,或收集等待处理的数据,或存放要被发往另一台计算机的数据。pdata存储类型属于xdata类型,它的一字节地址(高8位)被妥善保存在P2口中,用于I/O操作。idata存储类型可以间接寻址全部内部数据存储器空间(可以超过127个字节)。第第2章章 C51程序设计程序设计u存储器模式u存储模式决定了变量的默认存储类型,C51提供了3种存储器模式来存储变量。定义变量时如果省略“存储器类型选项,系统那么会按编译模式SMALL、COMPACT或LARGE所规定的默认存储器类型确定变量的存储区域,不能位于存放器中的参数传递变量和过程变量也保存在默认的存储器区域。无论什么存储模式都可以声明变量在任何的80C51存储区范围,而把最常用的命令如循环计数器和队列索引放在内部数据区,可以显著地提高系统性能。需要特别指出的是,变量的存储种类与存储器类型是完全无关的。uC51系统的存储模式,可以在源程序中用语句直接定义,也可以在C51的源程序调试集成软件环境中,通过对某个工程文件的选项来设置。第第2章章 C51程序设计程序设计pSMALL存储模式 pSMALL存储模式也叫小模式,该模式中,C51把所有函数变量和局部数据段,以及所有参数传递,都放在内部数据存储器data区,因此这种存储模式的优势为数据存取速度很快,但small存储模式的地址空间受限,因为访问速度快,在写小型应用程序时,变量和数据应放在data内部数据存储器。而在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据应放置在其他存储区域。pCOMPACT存储模式 pCOMPACT存储模式又称为压缩的存储模式,该模式下,所有的函数、程序变量和局部数据段定位在80C51嵌入式系统的pdata区。外部数据存储区采用分页访问,每页256字节,最多256页,通过存放器R0和R1对pdata区的数据进行间接寻址,比使用DPTR要快一些。第第2章章 C51程序设计程序设计pLARGE存储模式 pLARGE存储模式也叫大模式,该模式中,所有函数和过程的变量和局部数据段都定位在80C51的外部数据存储器中,容量最多可支持64 KB,要求使用DPTR数据指针访问数据或定义成xdada的存储器类型。p关于存储模式的设置,要注意以下两点 p如果用参数传递和分配再入函数的堆栈,应尽量使用SMALL存储模式。Keil C51尽量使用内部存放器组进行参数传递,在存放器组中可以传递参数的数量和压缩存储模式一样,再入函数的模拟栈将在xdata中,由于对xdata区数据的访问最慢,所以要仔细考虑变量应存储的位置,使数据的存储速度得到优化。第第2章章 C51程序设计程序设计可以使用混合存储模式。Keil允许使用混合的存储模式,这点在大存储模式中是非常有用的。在大存储器模式下,有些过程对数据传递的速度要求很高,就把过程定义在小存储模式存放器中,这使得编译器为该过程的局部变量在内部RAM中分配存储空间并保证所有参数都通过内部RAM进行传递。在小模式下,有些过程需要大量存储空间,可以把过程声明为压缩模式或大模式,这种过程中的局部变量将被存储在外部存储区中,也可以通过过程中的变量声明,把变量分配在xdata段中。重新定义数据类型C语言程序中,除了可以采用以上介绍的数据类型外,用户还可以根据需要对数据类型重新定义。重新定义时需用到关键字typedef,定义方法如下:typedef 已有的数据类型 新的数据类型名;第第2章章 C51程序设计程序设计p其中“已有的数据类型是指C语言中所有的数据类型,包括结构、指针和数组等,“新的数据类型名可按用户习惯或需要决定。关键字typedef的作用是将C语言中已有的数据类型作了置换,可用置换后的新数据类型名定义变量。例如:p typedef int word;/定义word为新的整型数据类型名p word i,j;/将i,j定义为int型变量p在这个例子中,先用关键字typedef将word定义为新的整型数据类型,定义的过程实际上是用word置换了int,因此下面就可以直接用word对变量i,j进行定义。而此时word等效于int,所以i,j被定义成整型变量。p一般而言,对typedef定义的新数据类型用大写字母表示,以便与C语言中原有的数据类型相区别。另外还要注意,用typedef可以定义各种新的数据类型名,但不能直接用来定义变量。typedef只是对已有的数据类型作了一个名字上的置换,并没有创造出一个新的数据类型,例如前面例子中的word,它只是int类型的一个新名字而已。第第2章章 C51程序设计程序设计n2.2.3 数组数组n数组是一组具有固定数目和相同类型数组元素数组是一组具有固定数目和相同类型数组元素的有序集合,其数组元素的类型为该数组的根的有序集合,其数组元素的类型为该数组的根本类型。构成一个数组的各元素必须是同一类本类型。构成一个数组的各元素必须是同一类型的变量,不允许在同一数组中出现不同类型型的变量,不允许在同一数组中出现不同类型的变量。的变量。n数组数据是用同一个名字的不同下标访问的,数组数据是用同一个名字的不同下标访问的,例如数组例如数组ai,当,当i0,1,2,n时时a0,a1,an分别是数组分别是数组ai的元素的元素(或或成员成员)。数组有一维、二维、三维、多维数组。数组有一维、二维、三维、多维数组之分。常用的有一维、二维数组和字符数组。之分。常用的有一维、二维数组和字符数组。第第2章章 C51程序设计程序设计u数组的定义和赋值 p一维数组 数据类型 数组名整型表达式例如char chl0定义了一个一维字符型数组,它有10个元素,每个元素由不同的下标表示,分别为ch0,ch1,ch2,ch9。注意:数组的第一个元素的下标为0而不是1,即数组的第一个元素是ch0而不是chl,而数组的第十个元素为ch9。p 二维数组 数据类型 数组名常量表达式常量表达式例如int a35定义了3行5列共15个元素的二维数组a。二维数组的存取顺序是:按行存取,先存取第一行元素的第0列,1列,2列,直到第一行的最后一列。然后返回到第二行开始,再取第二行的第0列,1列,直到第二行的最后一列。,如此顺序下去,直到最后一行的最后一列。第第2章章 C51程序设计程序设计 C语言允许使用多维数组,有了二维数组的根底,理解掌握多维数组并不困难。例如,float a234定义了一个类型为浮点数的三维数组。数组的初始化 所谓数组初始化,就是在定义说明数组的同时给数组赋新值。这项工作是在程序的编译中完成的。对数组的初始化可用以下方法实现:在定义数组时对数组的全部元素赋予初值,例:int idata a60,1,2,3,4,5;int a341,2,3,4,5,6,7,8,9,10,11,12;int a341,2,3,4,5,6,7,8,9,10,11,12;第第2章章 C51程序设计程序设计p 只对数组的局部元素初始化,例:pint idata a10(0,l,2,3,4,5);pint a34=1,5,9;p 假设定义数组时对数组的全部元素均不赋予初值,那么数组的全部元素被缺省地赋值为0。pint idata a10;那么a0a9全部被赋初值0。p字符数组p 用来存放字符数据的数组是字符数组。在字符数组中,一个元素存放一个字符,因此可以用字符数组存贮长度不同的字符串。p字符数组的定义 p字符数组的定义与前面的数组定义方法类似。如char a10,定义a为一个有10字符的一维字符数组。p字符数组置初值 第第2章章 C51程序设计程序设计字符数组置初值最直接的方法是将各字符逐个赋给数组中的各个元素。如:char a10B,E,I,J,I,N,G,0;定义了一个字符型数组a,有10个数组元素,并且将9个字符(其中包括一个字符串结束标志0)分别赋给了a0a8,剩余的a9被系统自动赋予空格字符。其状态如下图:C语言还允许用字符串直接给字符数组置初值,其方法有以下两种形式:char a10“BEI JING;char a10“BEI JING用双引号“括起来的一串字符,称为字符串常量。比方“Happy。C编译器会自动地在字符末尾加上结束符0(NULL)。用单引号括起来的字符为字符的ASCII码值,而不是字符串。比方a表示a的ASCII码值97,而“a表示一个字符串,它由两个字符a和0组成。第第2章章 C51程序设计程序设计一个字符串可以用一维数组来装入,但数组的元素数目一定要比字符多一个,以便C编译器自动在其后面参加结束符0。假设干个字符串可以装入一个二维字符数组中,称为字符数组。数组的第一个下标是字符串的个数,第二个下标定义每个字符串的长度,该长度应当比这批字符串中最长的串多一个字符,用于装入字符串的结束符0。比方char a6081,定义了一个二维字符数组a,它可容纳60个字符串,每串最长可达80个字符。例:uchar code msg17This is a test,n),message 1,n,message 2,n;这是一个二维数组,第二个下标必须给定,因为它不能从数据表中得到,第一个下标可缺省由数据常量表决定(本例中实际为3)。第第2章章 C51程序设计程序设计n指针指针n 指针有两个根本概念,即变量的指针和指针有两个根本概念,即变量的指针和指向变量的指针变量指向变量的指针变量(简称指针变量简称指针变量)。变量的。变量的指针就是变量的地址。假设有一个变量专门用指针就是变量的地址。假设有一个变量专门用来存放另一个变量的地址来存放另一个变量的地址(即指针即指针),那么该变,那么该变量称为指向变量的指针变量量称为指向变量的指针变量(简称指针变量简称指针变量)。指针变量的值是指针。指针变量的值是指针。n指针变量的定义指针变量的定义 n指针变量是含有一个数据对象地址的特殊变量,指针变量是含有一个数据对象地址的特殊变量,有关的运算符有两个,即取地址运算符和间有关的运算符有两个,即取地址运算符和间接访问运算符接访问运算符*。例如:。例如:na为地址,为地址,*P为指针变量所指向的变量。为指针变量所指向的变量。n指针变量的定义与一般变量的定义类似,其一指针变量的定义与一般变量的定义类似,其一般形式为:般形式为:n 数据类型数据类型存储器类型存储器类型 *指针变量名;指针变量名;n 其中,其中,“数据类型说明了该指针变量所数据类型说明了该指针变量所指向的变量的类型,存储器类型为可选项,是指向的变量的类型,存储器类型为可选项,是C51编译器的一种扩展。编译器的一种扩展。第第2章章 C51程序设计程序设计p这里是用&i对ip初始化,而不是对*ip初始化。与一般变量一样,对外部或静态指针变量,在定义中假设不带初始化项,指针变量被初始化为NULL,其值为0。pC51中规定,当指针值为0时,指针不指向任何有效数据,有时也称该类指针为空指针。因此,当调用一个返回指针的函数时,常使用返回值为NULL来指示函数调用中某些错误情况的发生。p下面是指针变量定义的例子:p char xdata*p1;/在xdata存储器中定义一个指向对象类型为char的基于存储器的指针p int*p2;/指向一个指向对象类型为int的一般 p指针变量的引用 第第2章章 C51程序设计程序设计p指针变量中只能存放地址,在使用中不要将一个整数赋给一指针变量。p下面的赋值是不合法的:p int*p;p p=100;p假设 int i=35,x;p int*p;p 这里定义了两个整型变量i、x,还定义了一个指向整型数的指针变量p。i、x中可存放整数,而p只能存放整型变量的地址。p 变量定义:int i,x,y,*px,*py;p 变量赋值:p p=i;/将变量i的地址赋给指针变量p,使p指向ip *p+=1;/等价于i+=i;p (*p)+;/等价于i+;p指向相同类型数据的指针之间可以相互赋值,例如:ppx=py;p 假设原来指针px指向x、py指向y,经上述赋值后,px和py都指向y。第第2章章 C51程序设计程序设计u指针的地址运算指针的地址运算u赋初值。指针变量的初值可以是赋初值。指针变量的初值可以是NULL(零零),也可,也可以是变量、数组、结构以及函数等地址。例如:以是变量、数组、结构以及函数等地址。例如:uint alO,b5;uchar*cptr1=NULL;uint*iptr1=a6;uint*iptr2=b;u指针与整数的加减。指针可以与一个整数或整数指针与整数的加减。指针可以与一个整数或整数表达式进行加减运算,从而获得该指针当前所指位表达式进行加减运算,从而获得该指针当前所指位置前面或后面某个数据的地址。假设置前面或后面某个数据的地址。假设p为一个指针为一个指针变量,变量,n为一个整数,那么为一个整数,那么pn表示离开指针表示离开指针p当前当前位置的前面或后面第位置的前面或后面第n个数据的地址。个数据的地址。u (3)指针与指针相减,其结果为一整数值,但它指针与指针相减,其结果为一整数值,但它并不是地址,而是表示两个指针之间的距离或成员并不是地址,而是表示两个指针之间的距离或成员的个数。这两个指针必须指向同一类型的数据。的个数。这两个指针必须指向同一类型的数据。第第2章章 C51程序设计程序设计p指针与指针的比较。指向同一类型数据的两个指针可以比较运算,从而获得两指针所指地址的大小关系。在计算指针地址的同时,还可以间接取值运算,间接取值的地址应该是地址计算后的结果,并且必须注意运算符的优先级和结合规那么。设p1、p2都是指针,对于“a=*p1+;,由于运算符*和+具有相同的优先级而指针运算具有右结合性,按左结合原那么,有+、*的运算次序,而运算符+在p1的后面。因此,上述赋值运算的过程是首先将指针p1所指的内容赋值给变量a,然后再指向下一数据,说明是地址增加而不是内容增加。对于“a=*()p1;,按左结合原那么有、*的运算次序,而运算符在p1的前面,因此首先将p1减1,即指向前面一个数据,然后再把p1此时所指的内容赋值给变量a。对于“a=(*p2)+;,由于使用括号()使结合次序变为*、+,因此首先将所指的内容赋值给变量,然后再把所指的内容加1,说明是内容增加而不是地址增加。第第2章章 C51程序设计程序设计u函数型指针函数型指针 u函数不是变量,但它在内存中仍然需要占据一定的存储空间,函数不是变量,但它在内存中仍然需要占据一定的存储空间,如果将函数的入口地址赋给一个指针,该指针就是函数型指如果将函数的入口地址赋给一个指针,该指针就是函数型指针。由于函数型指针指向的是函数的入口地址,因此可用指针。由于函数型指针指向的是函数的入口地址,因此可用指向函数的指针代替函数名来调用该函数。函数与变量不同,向函数的指针代替函数名来调用该函数。函数与变量不同,函数名不能作为参数直接传递给另一个函数。但利用函数型函数名不能作为参数直接传递给另一个函数。但利用函数型指针,可将函数作为参数传递给另一个函数。此外,还可以指针,可将函数作为参数传递给另一个函数。此外,还可以将函数型指针放在一个指针数组中,那么该指针数组的每一将函数型指针放在一个指针数组中,那么该指针数组的每一个成员都是指向某个函数的指针。个成员都是指向某个函数的指针。u定义一个函数型指针的一般形式为:定义一个函数型指针的一般形式为:u 数据类型数据类型(*标识符标识符)()u 其中,其中,“标识符就是所定义的函数型指针变量名,标识符就是所定义的函数型指针变量名,“数据类型说明了该指针所指向的函数返回值的类型。例如数据类型说明了该指针所指向的函数返回值的类型。例如“int(*funcl)();,定义了一个函数型指针变量;,定义了一个函数型指针变量funcl,它所指向的函数,它所指向的函数返回整型数据。函数型指针变量专门用来存放函数入口地址,返回整型数据。函数型指针变量专门用来存放函数入口地址,在程序中把哪个函数的地址赋给它,它就指向哪个函数。在在程序中把哪个函数的地址赋给它,它就指向哪个函数。在程序中可以对一个函数型指针屡次赋值,该指针可以先后指程序中可以对一个函数型指针屡次赋值,该指针可以先后指向不同的函数。向不同的函数。第第2章章 C51程序设计程序设计p给函数型指针赋值的一般形式为:p 函数型指针变量名=函数名p 如果有一个函数max(x,y),那么可以用以下赋值语句将函数的地址赋给函数型指针func1,使func1指向函数max:Func1=max。p 引入了函数指针后,对函数的调用可采用两种方法。例如,程序中要求将函数max(x,y)的值赋给变量z,可采用以下方法:p z=max(x,y);p z=(*func1)(x,y);p 用这两种方法实现函数调用的结果完全一致。如果采用函数型指针调用函数,必须预先对该函数指针进行赋值,使其指向所需调用的函数。p函数型指针通常用来将一个函数的地址作为参数传递到另一个函数。这种方法在调用的函数不是某个固定函数的场合特别适用。第第2章章 C51程序设计程序设计u返回指针型数据的函数返回指针型数据的函数 u 在函数的调用过程结束时,被调用的函数可以带在函数的调用过程结束时,被调用的函数可以带回一个整型数据、字符型数据等,也可以带回一个回一个整型数据、字符型数据等,也可以带回一个指针型数据,即地址。这种返回指针型数据的函数指针型数据,即地址。这种返回指针型数据的函数又称为指针函数,其一般定义形式为:又称为指针函数,其一般定义形式为:u 数据类型数据类型*函数名函数名(参数表参数表);u其中,其中,“数据类型说明了所定义的指针函数在数据类型说明了所定义的指针函数在返回时带回的指针所指向的数据类型。例如:返回时带回的指针所指向的数据类型。例如:int*p(a,b),定义了一个指针函数,定义了一个指针函数*p,调用它以后可以,调用它以后可以得到一个指向整型数据的指针,即地址。在指针函得到一个指向整型数据的指针,即地址。在指针函数数*p的两侧没有括号的两侧没有括号(),与函数型指针是完全不同,与函数型指针是完全不同的,使用时要注意区分。的,使用时要注意区分。u指针数组指针数组 u由于指针本身也是一个变量,指针数组适用于指由于指针本身也是一个变量,指针数组适用于指向假设干个字符串,使字符串的处理更为方便。向假设干个字符串,使字符串的处理更为方便。第第2章章 C51程序设计程序设计p指针数组的定义方法与普通数组完全相同,一般形式为:p 数据类型*数组名数组长度p 例如:pint*b5;/指向整型数据的2个指针p char*sptr5;/指向字符型数据的5个指针p 指针数组在使用前往往需要先赋初值。使用指针数组最典型的场合是通过对字符数组赋初值而实现各维长度不一致的多维数组的定义。p指针型指针p指针型指针所指向的是另一个指针变量的地址,故有时称为多级指针。定义一个指针型指针变量的一般形式为:p 数据类型*指针变量名p 其中,“数据类型说明一个被指针型指针指向的指针变量所指向的变量数据类型。第第2章章 C51程序设计程序设计n2.2.5 结构与联合结构与联合n结构结构n 结构是一种构造类型的数据,它是将假结构是一种构造类型的数据,它是将假设干个不同类型的数据变量有序地组合在一起设干个不同类型的数据变量有序地组合在一起形成的一种数据集合体,组成该集合体的各个形成的一种数据集合体,组成该集合体的各个数据变量称为结构成员,整个集合体使用一个数据变量称为结构成员,整个集合体使用一个独立的结构变量名。一般来说,结构中的各个独立的结构变量名。一般来说,结构中的各个变量之间存在某些关系,由于结构是将一组相变量之间存在某些关系,由于结构是将一组相关联的数据变量作为一个整体来进行处理,因关联的数据变量作为一个整体来进行处理,因此在程序中使用结构将利于对一些复杂而又具此在程序中使用结构将利于对一些复杂而又具有内在联系的数据进行有效的管理。有内在联系的数据进行有效的管理。n结构变量的定义结构变量的定义 n 结构也是一种数据类型,可以使用结构变量,结构也是一种数据类型,可以使用结构变量,因此像其他类型的变量一样,在使用结构变量因此像其他类型的变量一样,在使用结构变量时要先对其定义,其一般形式为:时要先对其定义,其一般形式为:第第2章章 C51程序设计程序设计struct 结构名 类型变量名 类型变量名结构变量;结构名是结构的标识符不是变量名,其类型为数据类型,包括整型、浮点型、字符型、指针型和无值型。在C51中,为结构提供了连续的存储空间,成员名用来对结构内部进行寻址。例如,定义一个日期结构类型date,结构变量d,它由3个成员组成,定义格式如下:struct date int year;char month,day;d;如果需要定义多个具有相同形式的结构变量,可以先作结构说明,再用结构名来定义变量。例如:struct date d1,d2,d3;第第2章章 C51程序设计程序设计结构类型与结构变量是两个不同的概念。定义一个结构类型时只是给出了该结构的组织形式,并没有给出具体的组织成员。因此结构名不占用任何存储空间,也不能对一个结构名进行赋值、存取和运算。而结构变量是一个结构中的具体成员,编译器会给具体的结构变量名分配确定的存储空间,因此可以对结构变量名进行赋值、存取和运算。结构变量的引用 结构是一个新的数据类型,因此结构变量也可以像其他类型的变量一样赋值、运算,不同的是结构变量以成员作为根本变量。结构成员的一般形式为:结构变量.成员名第第2章章 C51程序设计程序设计p结构变量的初始化 p使用结构变量之前,要对其进行初始化。例如:pstructp long int num;/学号p char name20;/姓名p char

    注意事项

    本文(51单片机C语言应用与开发().ppt)为本站会员(e****s)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开