protel第六讲.doc_第1页
protel第六讲.doc_第2页
protel第六讲.doc_第3页
protel第六讲.doc_第4页
protel第六讲.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六讲 单片机C语言(2)C51构造数据类型1. 数组一维数组的定义类型说明符 数组名常量表达式如 int a10; /表示数组名为a,数组类型为整型,共10个元素。数组必须先定义再使用。数组元素的表示形式为: 数组名下标 如 a0 a1一维数组的初始化在定义数组时对数组元素赋以初值如 int a10=0,1,2,3,4,5,6,7,8,9;可以只给一部分元素赋值如 int a10=0,1,2,3,4; /后5个元素的值均为0。对全部数组元素赋值时,可以不指定数组长度。如 int a =0,1,2,3,4,5,6,7,8,9;二维数组的定义类型说明符 数组名常量表达式 常量表达式 如 int a25二维数组的初始化如 int a34= 1,2,3,4,5,6,7,8,9,10,11,12 ;或 int a34 =1,2,3,4,5,6,7,8,9,10,11,12;对数组中部分元素赋值 如 int a34= 1,2,3 ; int a34= 1, , 5,6 ;字符数组的定义与以上同, 如 char c10;字符数组的初始化给数组元素逐个赋值 如 char a10=z,h,o,n,g,G,u,o, ;用字符串赋值 如 char a =“ZhongGuo”; char a =“ZhongGuo”;2. 指针概念变量的指针: 一个变量的地址称之为“这个变量的指针”。指针变量:如果专门使用一个变量来存放另一变量的地址,则该变量称为指针变量。指针变量的定义基类型 * 指针变量名为了能够在程序运行时获得变量地址,以及能够使用指针所指变量的值,C语言提供了2个运算符: & 取地址运算符。 * 指针运算符或“间接访问”运算符。如 &a 为变量a的地址, *point 为指针变量point所指向的存储单元的值。3. Keil C51的指针类型基于存储器的指针这些指针的长度可为1字节(idata *, data *, pdata *)或2字节(code *, xdata *)如 char xdata *px; /在xdata存储器中定义了一个指向字符类型的指针,长度为2字节,值为00xffff。char xdata *data pdx; /明确定义指针位于80C51内部存储区(data)中,其他同上例。data char xdata *pdx; /与上例完全相同。存储器类型定义既可放在定义开头,也可直接放在定义的对象之前。一般指针一般指针包括3字节:2字节的偏移量和1字节的存储器类型。其中第1个字节表示指针的存储器类型,存储器类型编码如下:如 一个一般指针指向地址为0x1234的xdata类型数据时,其指针值如下表。4. 结构定义结构的类型struct 结构名 结构成员说明 ;结构成员说明的格式为:类型标识符 成员名;例 struct date unsigned char month; unsigned char day; unsigned int year;定义结构类型变量先定义结构的类型,再定义该结构的变量名。例 date dt1, dt2; /定义两个数据类型为date的变量dt1和dt2。在定义结构类型的同时定义该结构的变量struct 结构名 结构成员说明 变量名1,变量名2 变量名n;直接定义结构类型变量struct 结构成员说明 变量名1,变量名2, 变量名n;结构类型变量的引用对结构所执行的操作,只能用“&”运算符取结构的地址,或对结构变量的成员分别加以引用,引用方式为:结构变量名. 成员名;例 dt1.year = 2005;其中“.”是成员运算符,“”符号和“.”符号相同,一般多级引用时,最后一级用”.”,高的级别用“”。5. 用typedef定义类型在C语言中可用typedef声明新的类型名来代替已有的类型名。例如 typedef int INTEGER; typedef float REAL;用INTEGER代表int 类型,REAL代表float。函数一个较大的程序一般由若干个程序模块组成,每个模块用来实现一个特定的功能,所有高级语言都有子程序这一概念,程序的各模块正是通过子程序来实现。而子程序的作用是由函数来完成。一个完整的C程序可由一个主函数和若干个函数组成,由主函数调用其他函数,其他函数也可互相调用。同一个函数可以被一个或多个函数调用任意多次。C语言中的主函数为main( )函数。关于函数的几点说明一个源程序文件由一个或多个函数组成。一个C程序由一个或多个源程序文件组成。C程序的执行从main函数开始。所有函数都是平行的,即在定义函数时是相互独立的,函数间可相互调用,但不能调用main函数。从函数的形式看,函数分两类:无参函数。主调函数不向被调用函数传递参数,这类函数就是完成一定的操作功能。有参函数。在调用函数时,主调函数将一些数据传递给被调用函数,被调用函数会对这些数据进行处理,然后进行不同的操作,或得到一个可带回到主调函数中的计算结果。从用户使用的角度看,函数可分为两种:标准函数即库函数。由编译系统(如Keil软件)提供的,用户不必自行编写这些函数的程序,而可直接使用这些函数所提供的功能。如 sin函数可提供正弦函数计算功能。用户函数。这是用户根据自己的需要而编写的特定功能的函数。1.函数的定义从函数的形式上划分,函数有无参数函数和有参数函数两种形式。无参函数的定义类型标识符 函数名( ) 声明部分 语句有参函数的定义类型标识符 函数名(形式参数列表) 声明部分 语句空函数C语言允许有空函数,空函数的定义形式为:类型说明符 函数名() 2. 函数参数和函数的值C语言采用函数之间的参数传递方式,使一个函数能对不同的变量进行功能相同的处理,从而大大提高函数通用性与灵活性。函数之间的参数传递,由函数调用时主调函数的实际参数与被调函数的形式参数之间进行数据传递来实现。如果被调函数有返回值,那么这个值可通过return语句返回给主调函数。形式参数和实际参数形式参数:定义函数时,函数名后面括号中的变量名称为“形式参数”,简称“形参”。实际参数:调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”。例: int max( int x, int y) /其中x和y为形式参数。 z= max(5,9); /主调函数调用以上函数时,其中5和9为实际参数。说明:定义函数中指定的形参在未出现函数调用时,它们并不占用内存中的存储单元。只在发生函数调用时,函数中的形参才被分配内存单元,在调用结束后,形参所占用的内存单元也被释放。实参可以是常量、变量或表达式在被定义的函数中,必须指定形参的类型。实参与形参的类型应相同或赋值值兼容。C语言规定,实参变量对形参变量的数据传递是“值传送”。即单向传递,只由实参传给形参,而不能由形参返回给实参。函数的返回值 函数的返回值是通过函数中的return语句获得。在定义函数时对函数值说明的类型应与return语句表达式的类型一致,若不一致,则以函数类型为准。3.函数的调用函数调用的一般形式函数名(实参列表)函数调用的方式把函数调用作为一个语句。如 print_message( );函数结果作为表达式的一个运算对象如 c=2 * max(a,b); 函数参数函数调用作为一个函数的实参。如 m=max (a, min(b,c) );调用函数的声明和函数原型在一个函数中调用另一个函数必须同时具备以下一些条件:被调用函数必须是已经存在的函数(库函数或用户自己定义的函数)。如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所用到的信息“包含”到本文件中。如 # include 则可使用C编译系统提供的数学函数。如果使用用户自定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应在主调函数中对被调函数作声明。如 void main( ) int max( int x, int y); /对被调函数作声明 int a=10, b=20, c; c=max(a,b); printf(“ Max is %dn”,c); int max( int x,y) int z; z=xy? x:y; return (z); 在C语言中,以上的函数声明称为函数原型。函数原型的一般形式为:函数类型 函数名(参数类型1,参数类型2 )函数类型 函数名(参数类型1 参数名1, 参数类型2 参数名2 )4. 函数的嵌套调用在C语言中允许嵌套调用函数,即在调用一个函数的过程中,允许调用另一函数。如 z=max (a, min (b, c) ); 函数的递归调用在调用函数时,又直接或间接地调用该函数本身,这种情况称为函数的递归调用。5. C51 函数的重入在同一时间内,一个函数在执行时,是否允许再次调用这个函数本身。通常在编写C51 的中断程序时会遇到这种情况。6. 用函数指针变量调用函数C语言中的一个函数其实就是一段连续的代码,在函数编译、链接后,这段代码在存储器中存放时,必然占用一个确切的地址。这个地址由C语言的编译系统确定。如果找到这个函数起始代码所在的存储器位置,实际上就找到了这段代码。要找到一个函数的入口,可以定义一个指针变量,然后让这个指针指向这个函数,即让这个指针变量的值等于函数所在位置的地址值。例 # include # include void init_ser( ) SCON = 0x50; /SCON:模式1,8-bit UART, 允许接收 TMOD = 0x20; /TMOD:定时器1,模式2,8位自动重载模式 TH1 = 0xf3; /TH1:波特率为2400 TR1 = 1; /TR1: 定时器1开始运行 TI =1: long factorial (int n) long result; if (n= =0) result =1; else result =n * factorial (n-1); return result; void main( ) int j; long tmp; long (* p) (int n); /定义函数指针变量 init_ser( ); p=(void *) factorial; /函数指针变量p指向factorial( )函数 for (j =0; j11; j+) tmp=(*p) (j); /用指针变量p调用factorial( )函数 printf(“%d != %ldn”, j, tmp); for ( ; ; ) ; 函数指针变量调用函数的格式说明: 指向函数的指针变量的一般形式为:数据类型 (*指针变量名)( );其中数据类型指函数返回值的类型。(*p ) ( )表示定义一个指向函数的指针变量。它不是固定指向哪一个函数的,而是表示定义了这样一个类型的变量,用来专门存放函数的入口地址,在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。在给函数指针变量赋值时,只需给出函数名而不必给出参数,如 p=( void * ) factorial;不能写成 p=( void *)factorial( ); 用函数指针变量调用函数时,只需将“(*p)”代替函数名即可。7. 局部变量和全局变量一个C语言程序中的变量可以被这个程序中所有函数使用,也可仅在一个函数中有效,这就是局部变量和全局变量的概念。在函数内定义的变量称为“局部变量”;在函数外定义的变量称为“外部变量”,即全局变量。其作用范围从定义变量位置到文件结束。8. 变量的存储类别静态存储方式和动态存储方式静态存储方式指在程序运行期间分配固定存储空间的方式。动态存储方式是在程序运行期间根据需要进行动态分配存储空间的方式。auto 变量函数中的局部变量,若不专门声明为static存储类别,则都是动态分配存储空间,函数中的形参和函数中定义的变量均属于此类,在调用函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此此类局部变量称为“自动变量”。自动变量用关键字auto作存储类别声明。实际程序中auto可省略,因此程序中未加特别申明的都是自动变量。static变量有时希望函数中局部变量的值在函数调用结束后不消失而保留原值,即占用存储单元不释放,直到下一次调用该函数时,该变量的值仍得以保留。这时需将局部变量指定为“静态局部变量”,用关键字static进行声明。用extern声明外部变量外部变量(即全局变量)是在函数的外部定义,其作用域为从变量的定义处开始,到本程序文件的结束。在此作用域内全局变量可以被程序中各个函数所引用。有时还需用extern来声明外部变量,以扩展外部变量的作用范围。一个C程序可以由一个或多个源程序文件组成,如果一个程序中需要引用另一文件中已定义的外

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论