第11章C51的函数

合集下载

单片机C语言C51的常用库函数

单片机C语言C51的常用库函数

C51的常用库函数详解C51语言的编译器中包含有丰富的库函数,使用库函数可以大大简化用户程序设计的工作量,提高编程效率。

每个库函数都在相应的头文件中给出了函数原型声明,在使用时,必须在源程序的开场处使用预处理命令#include将有关的头文件包含进来。

C51库函数中类型的选择考虑到了8051单片机的构造特性,用户在自己的应用程序中应尽可能地使用最小的数据类型,以最大限度地发挥8051单片机的性能,同时可减少应用程序的代码长度。

下面将C51的库函数分类列出并详细介绍其用法。

1 字符函数字符函数的原型声明包含在头文件CTYPE.H中。

常用的一些字符函数介绍如下。

1.1 检查英文字母函数检查英文字母函数用于检查形参字符是否为英文字母,其函数原型如下:bit isalpha(char c);其中,c为待判断的字符,如果是英文字母则返回1,否则返回0。

程序例如如下:1.2 检查字母数字函数检查字母数字函数用于检查形参字符是否为英文字母或数字字符,其函数原型如下:bit isalnum(char c);1.3 检查控制字符函数检查控制字符函数用于检查形参字符是否为控制字符,其函数原型:bit istrl (char c);其中,c为待判断的字符。

控制字符其取值围为0*00~0*lF之间或等于0*7F,如果是,则返回1,否则返回0。

1.4 十进制数字检查函数十进制数字检查函数用于检查形参字符是否为十进制数字,其函数原型如下:bit isdigit (char c);其中,c为待判断的字符,如果是十进制数字则返回1,否则返回0。

1.5 可打印字符检查函数可打印字符检查函数用于检查形参字符是否为可打印字符,其函数原型如下:bit isgraph (char c);其中,c为待判断的字符。

可打印字符的取值围为0*21~0*7C,不包含空格,如果是可打印字符则返回1,否则返回0。

1.6 包含空格的可打印字符检查函数包含空格的可打印字符检查函数用于检查形参字符是否为可打印字符以及空格,其函数原型如下:bit isprint (char c);其中,c为待判断字符。

C51库函数详解

C51库函数详解

_chkfloat_:函数定义:unsigned char _chkfloat_ ( float val); /* number to check */函数功能:_chkfloat_函数检查浮点数val 的类型。

返回值:_chkfloat_函数返回浮点数val 的类型。

返回值意义0 标准浮点数1 浮点02 +INF 正溢出3 -INF 负溢出4 NaN 非数函数测试:#include <reg51.h>#include <intrins.h>/*本实验测试本征库中的_chkfloat_函数函数定义:unsigned char _chkfloat_(float val);返回值:Return Value Meaning0 Standard floating-point number.1 Floating-point value 0.2 +INF (positive overflow).3 -INF (negative overflow).4 NaN (Not a Number) error status.用P1指示返回值*/unsigned char f[4]={0xff,0xff,0xff,0xff};void delay(unsigned int time){while(time--);}void main(){P2=~_chkfloat_(1.2455); //Standard floating-point number.delay(50000);P2=~_chkfloat_(0.00); //Floating-point value 0.delay(50000);P2=~_chkfloat_(1000000000000000000000000000000000000000000000000000000000000000.0000 000000); //+INF (positive overflow).delay(50000);P2=~_chkfloat_(-1000000000000000000000000000000000000000000000000000000000000000.000 0000000); //-INF (negative overflow).delay(50000);P2=~_chkfloat_(*((float *)f)); //NaN (Not a Number) error status.while(1);_crol_:函数定义:unsigned char _crol_ ( unsigned char c, /* character to rotate left */unsigned char b); /* bit positions to rotate */ 函数功能:_crol_函数将一个字节c循环左移b位。

c51单片机的循环左移函数 _crol_ 源码

c51单片机的循环左移函数 _crol_ 源码

c51单片机的循环左移函数 _crol_ 源码1. 背景介绍c51单片机是一种广泛应用于嵌入式系统的微控制器,它采用的是哈佛结构的指令集架构,因此在开发过程中需要编写大量的汇编语言代码。

在c51单片机中,循环左移函数_crol_是一个非常常用的函数,它可以实现对一个字节或字的循环左移操作,是嵌入式系统开发中的基础函数之一。

2. 循环左移函数_crol_的功能循环左移函数_crol_的功能是将一个字节或字进行左移操作,并且在移动的过程中将最高位移到最低位,其他位依次向高位移动。

对于一个8位的二进制数xxx,经过一次循环左移后,变成xxx。

3. _crol_函数的源码在c51单片机中,_crol_函数的源码通常以汇编语言的形式编写,下面是一个常见的_crol_函数源码示例:```assembly_crol:mov a, r0 ; 将需要左移的字节或字存入累加器arlc a ; 累加器a的内容左移一位,并将最高位的值存入CY(进位标志位)mov r0, a ; 将左移后的结果存入r0ret ; 函数返回```4. _crol_函数源码解析以上是一个简单的_crol_函数的源码示例,下面对其进行解析:- 将需要左移的字节或字存入累加器a中;- 使用指令rlc a将累加器a的内容左移一位,并且最高位的值存入CY (进位标志位)中;- 将左移后的结果存入r0中;- 函数返回。

5. _crol_函数源码的优化上述的_crol_函数源码虽然可以实现循环左移的功能,但是在性能和效率上并不是最优的。

下面是对_crol_函数源码的一些优化建议:- 如果在c51单片机的开发中需要频繁使用循环左移操作,可以考虑将_crol_函数的源码嵌入到其他函数中,以减少函数调用的开销;- 通过使用位操作指令,可以进一步提高_crol_函数的执行效率,例如使用指令“rl a”来代替“rlc a”。

6. 总结在c51单片机的开发中,循环左移函数_crol_是一个非常基础且常用的函数,它可以帮助开发者实现对字节或字的循环左移操作。

c51调汇编移位函数

c51调汇编移位函数

C51调汇编移位函数详解引言在C51单片机编程中,移位操作是一种常见的操作。

移位操作可以将一个数的二进制表示在内部进行左移或右移,从而改变数的值。

C51提供了一些用于实现移位功能的汇编指令,如RL、RR、SL、SR等。

为了方便使用这些指令,可以编写一些特定函数来实现不同类型的移位操作。

本文将详细解释C51调汇编移位函数中的特定函数,包括函数的定义、用途和工作方式等。

函数定义在C语言中,可以使用__asm关键字来嵌入汇编代码。

通过嵌入汇编代码,可以直接调用C51提供的汇编指令。

下面是一个示例函数left_shift()的定义:void left_shift(unsigned char *data, unsigned char count) {__asmmov r0, dpl ; 将data指针中的值赋给r0寄存器mov r1, dph ; 将data指针中的高字节值赋给r1寄存器mov a, count ; 将count赋给累加器astart:rl a ; 左移累加器amovx @r0, a ; 将累加器a的值写入data指针所指向的内存inc r0 ; data指针自增1djnz r1, start ; 如果r1不为0,则跳转到start标签处继续执行__endasm;}函数用途left_shift()函数的作用是将一个字节的数据进行左移操作。

左移操作是指将一个数的二进制表示向左移动指定的位数,低位补零。

这种操作可以用来实现乘以2的幂次方运算。

例如,对于数据0b00001010,左移一位后得到0b00010100,等价于乘以2。

函数工作方式left_shift()函数使用了C51提供的汇编指令rl和movx来实现左移操作。

下面是函数工作方式的详细解释:1.将传入的指针data中存储的值分别赋给寄存器r0和r1。

寄存器r0用于访问data指针所指向的内存地址,寄存器r1用于保存data指针所指向内存地址的高字节。

C语言中KeilC51库函数大全

C语言中KeilC51库函数大全

C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。

第一节本征库函数(i n t r i n s i c r o u t i n es)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL 和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。

C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入NOP_testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。

_chkfloat_:测试并返回源点数状态。

使用时,必须包含#inclucle <>一行。

如不说明,下面谈到的库函数均指非本征库函数。

第二节几类重要库函数1. 专用寄存器include文件例如8031、8051均为其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。

2. 绝对地址include文件该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。

3. 动态内存分配函数,位于中4. 缓冲区处理函数位于“”中其中包括拷贝比较移动等函数如:memccpy memchr memcmp memcpy memmove memset这样很方便地对缓冲区进行处理。

5. 输入输出流函数,位于“”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的及源文件,然后在库中替换它们即可。

第三节K ei l C51库函数原型列表1.bit isalnum(char c);bit isalpha(char c);bit iscntrl(char c);bit isdigit(char c);bit isgraph(char c);bit islower(char c);bit isprint(char c);bit ispunct(char c);bit isspace(char c);bit isupper(char c);bit isxdigit(char c);bit toascii(char c);bit toint(char c);char tolower(char c);char __tolower(char c);char toupper(char c);char __toupper(char c);2.unsigned char _crol_(unsigned char c,unsigned char b);unsigned char _cror_(unsigned char c,unsigned char b);unsigned char _chkfloat_(float ual);unsigned int _irol_(unsigned int i,unsigned char b);unsigned int _iror_(unsigned int i,unsigned char b);unsigned long _irol_(unsigned long l,unsigned char b);unsigned long _iror_(unsigned long L,unsigned char b);void _nop_(void);bit _testbit_(bit b);3.char getchar(void);char _getkey(void);char *gets(char * string,int len);int printf(const char * fmtstr[,argument]…);char putchar(char c);int puts (const char * string);int scanf(const char * fmtstr.[,argument]…);int sprintf(char * buffer,const char *fmtstr[;argument]);int sscanf(char *buffer,const char * fmtstr[,argument]);char ungetchar(char c);void vprintf (const char *fmtstr,char * argptr);void vsprintf(char *buffer,const char * fmtstr,char * argptr);4.float atof(void * string);int atoi(void * string);long atol(void * string);void * calloc(unsigned int num,unsigned int len);void free(void xdata *p);void init_mempool(void *data *p,unsigned int size);void *malloc (unsigned int size);int rand(void);void *realloc (void xdata *p,unsigned int size);void srand (int seed);5.void *memccpy (void *dest,void *src,char c,int len);void *memchr (void *buf,char c,int len);char memcmp(void *buf1,void *buf2,int len);void *memcopy (void *dest,void *SRC,int len);void *memmove (void *dest,void *src,int len);void *memset (void *buf,char c,int len);char *strcat (char *dest,char *src);char *strchr (const char *string,char c);char strcmp (char *string1,char *string2);char *strcpy (char *dest,char *src);int strcspn(char *src,char * set);int strlen (char *src);char *strncat (char 8dest,char *src,int len);char strncmp(char *string1,char *string2,int len);char strncpy (char *dest,char *src,int len);char *strpbrk (char *string,char *set);int strpos (const char *string,char c);char *strrchr (const char *string,char c);char *strrpbrk (char *string,char *set);int strrpos (const char *string,char c);int strspn(char *string,char *set);系统分类:用户分类:标签:无标签来源:整理阅读全文(121) | 回复(0)发表于2009/6/23 13:41:24Hello位于\C51\excmples\Hello\目录,其功能是向串口输出“Hello,world”整个程序如下:#pragma DB OE CD#indule <>#include<>void main(void){SCOn=0x50;TMOD=0x20TH1=0xf3;Tri=1;TI=1;printf(“Hello,world \n”);while(1) { }}第一节u V i s i o n f o r W i n d o w s的使用步骤(1) file_new新建一个文件,输入如上内容或直接用目录下源文件。

c51中的intrins库函数

c51中的intrins库函数

c51中的intrins库函数流水灯循环左移右移,用C语言,要高效的话,只有用伪本征函数文件“intrins.h”中的_crol_(),_cror_()...等等函数,具体解释如蓝色文字,例如,要用P1口驱动8个共阳连接的二极管左循环一个一个地亮,语句是 P1=_crol_(a,1);//a储存被移位的字符。

_crol_ 字符循环左移_cror_ 字符循环右移_irol_ 整数循环左移_iror_ 整数循环右移_lrol_ 长整数循环左移_lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JBC 指令详解:函数名: _crol_,_irol_,_lrol_原型: unsigned char _crol_(unsigned char val,unsigned char n);unsigned int _irol_(unsigned int val,unsigned char n);unsigned int _lrol_(unsigned int val,unsigned char n);功能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。

例:#includemain(){unsigned int y;C-5 1 程序设计 37y=0x00ff;y=_irol_(y,4); /*y=0x0ff0*/}函数名: _cror_,_iror_,_lror_原型: unsigned char _cror_(unsigned char val,unsigned char n);unsigned int _iror_(unsigned int val,unsigned char n);unsigned int _lror_(unsigned int val,unsigned char n);功能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。

C51的中断函数

C51的中断函数

C51的中断函数C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]以下是一些分析:一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。

二、using的用法,using可以修饰任何函数,不过个人建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。

同时个人建议中断函数应该使用using这个关键字。

三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,前天在论坛上我和别人争论过这个问题,现在我还是这个观点:有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;前天有人跟我叫劲,说假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL和RET两条语句,我不敢苟同,我是实际调试发现的,当你程序比较复杂时,你将那部分单独拉出来做成函数,可能代码和时间都会更好。

四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant来修饰,是的,的确可以这样解决,不过个人不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,个人建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。

C51的部分常用库函数_51单片机应用开发从入门到精通_[共3页]

C51的部分常用库函数_51单片机应用开发从入门到精通_[共3页]

第3章 MCS-51单片机软件开发环境
37 3.3.2 C51的部分常用库函数
本小节将简要介绍C51的部分常用库函数。

1.abs 函数
abs 函数的详细介绍如表3.14所示。

表3.14 abs 函数介绍 函 数 原 型
#include <math.h> int abs(int x); 函数参数
x :整型 函数功能 计算x 的绝对值 函数返回值
x 的绝对值,整型
说明:在math.h 头文件中,除了abs 函数之外,还有类似的acos 、asin 、atan 等函数。

2.ceil 函数
ceil 函数的详细介绍如表3.15所示。

表3.15 ceil 函数介绍 函 数 原 型
#include <math.h> float ceil(float x); 函数参数
x :浮点数 函数功能
求大于或等于x 的最小整数 函数返回值
大于或等于x 的最小整数,浮点数
说明:在math.h 头文件中,有类似ceil 的求小于或等于x 的最大整数的floor 函数。

3.getchar 函数
getchar 函数的详细介绍如表3.16所示。

表3.16 getchar 函数介绍 函 数 原 型
#include <stdio.h> char getchar(void); 函数参数
无 函数功能
从MCS-51单片机硬件的输入接口用_getkey 函数读入一个字符并且将此字符传递给putchar 函数用于回应 函数返回值
来自输入接口的下一个字符,整型,有ASCII 对应码值
4.gets 函数
gets 函数的详细介绍如表3.17所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 无参函数:主调函数和被调函数之间不进行参数传送,因 此在函数定义、函数说明及函数调用中也就可以不带参数。 此类函数通常用来完成一组指定的功能,可以带有返回值, 也可以没有返回函数值。
• 有参函数:主调函数和被调函数之间存在参数传送,因此 在函数定义及函数说明时都需要有参数,称为“形式参数” (简称为“形参”)。在主调函数中进行函数调用时也必 须给出参数,称为“实际参数”(简称为“实参”)。在 函数调用时,主调函数将把实参的值传送给形参,供被调 函数使用。有参函数可以带有返回值,也可以没有返回函 数值。
• 函数的值只能通过return语句返回主调函数。 return 语句的一般形式为:
• return 表达式; • 或者为: • return (表达式);
11.5 函数的调用
• 函数的调用是指函数在主调函数中的调用形式。在前面的 实例中其实已经用到了函数的调用。在C51语言中,函数的 调用的一般形式如下:
• 示例如下: • int f(int x)
//函数定义 •{ • int y; • z=f(y);
//递归调用 • return z; •}
11.5.3 嵌套调用
• 嵌套调用即在被调函数中又调用了其他函数的调用形式。 C51语言中不允许作嵌套的函数定义。但是允许调用其他的 函数,因为除了主函数外,各个函数都是平行的。这与其 他高级语言的子程序嵌套的情形是类似的。示例如下:
• 除了主函数外,C51还提供了极为丰富的库函数,而且还允许用户 自定义函数。在C51程序中,由主函数调用其他函数,其他函数之 间也可以相互调用。同一个函数可以被一个或多个函数调用任意 次。
• 在使用C51函数时,需要注意如下几点: • C51的源程序的函数数目是不限的。 • 在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定
• 在函数调用时,数据传送是单向的从实参传送给形参,而 不能把形参的值反向地传送给实参。因此在函数调用过程 中,形参的值发生改变,而实参中的值不会变化。
11.3.2 数组作为函数参数
• 数组可以作为函数的参数使用,进行数据传送。在C51语言中,数 组用作函数参数有两种形式:一种是把数组元素(下标变量)作 为实参使用;另一种是把数组名作为函数的形参和实参使用。下 面分别进行讲解。
• 1.数组元素作函数实参:数组元素作函数实参是指在发生函数调 用时,把作为实参的数组元素的值传送给形参,实现单向的值传 送。其中数组元素就是下标变量,与普通变量是完全相同的。这 里举例讲解数组元素作函数实参在程序设计中的应用。这里自定 义一个函数fun(),用于判别一个整数数组中各元素的值,若是奇 数则输出该值,否则不输出。
11.6 函数及其变量的作用域
• 函数及其变量的作用域是指函数的有效范围,以 及函数内部变量的有效范围。下面分别进行讲解。
11.6.1 函数的作用域
• 函数的作用域是函数内部代码和数据的使用范围。在C51语 言中,每一个函数都是一个独立的代码块,函数代码是隐 藏于函数内部归该函数所有的。使用时需要注意如下几点:
• “return语句”用于返回函数执行的结果,如果没有返回值,则可以
省略该语句。
11.3 函数的参数
• 函数的参数用于主调函数与被调函数间进行的数 据交换。在C51语言中,实参和形参都可以采用多 种数据类型。函数的参数是个很重要的内容。
11.3.1 形参和实参
• 在函数调用过程中,函数的参数可以分为形参和实参两种。 发生函数调用时,主调函数把实参的值传送给被调函数的 形参,从而实现主调函数向被调函数的数据传送。函数的 形参和实参在使用时需要注意如下几点:
11.2 函数的定义
• 在C51语言中,函数定义的一般一般形式如下:
• 类型说明符 函数名(形式参数列表)
• 形参类型说明
•{
• 语句
• return语句
•}
• 其中:
•q
“类型说明符”声明了函数返回值的类型,该返回值可以
是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。
如果函数没有返回值,则可以采用void说明符。函数类型的说明必须
处于对它的首次调用之前,这样C51程序编译时才能为返回非整型值
的函数生成正确代码。
•q
“形式参数列表”是一个用逗号分隔的参数变量表。当函
数被调用时,这些变量接收调用参数的值。如果函数是无参函数,这
时函数表是空的,但括号仍然是必须要有的。
•q
“形参类型说明”声明了函数内部参数的类型。其数据类
型可以为C51语言支持的数据类型。
11.7 main函数
• main函数是C51程序中的特殊函数,是整个程序的入口。一 般来说,一个C51程序都要有一个主函数main(),而且只能 有一个。C51程序的执行总是从main函数开始,如果有其他 函数,则完成对其他函数的调用后再返回到主函数,最后 由main函数结束整个程序。
• 一个C51程序常由一个主函数和若干个函数构成。由主函数 调用其他函数,其他函数之间也可以相互调用。main()函 数作为主调函数允许main()调用其他函数并传递参数。 main()函数既可以是无参函数,也可以是有参的函数。对 于有参的形式来说,就需要向其传递参数。但是其他任何 函数均不能调用main()函数。当然也同样无法向main()函 数传递参数,只能由程序之外传递而来。
11.3.4 指针作为函数参数
• 指针作为函数参数是指在发生函数调用时,把指 针变量传送给形参,实现单向的值传送。使用指 针类型做函数的参数,实际向函数传递的是变量 的地址。这里举例讲解指针作为函数参数的应用, 程序示例如下:
11.4 函数的返回值
• 函数的返回值是指函数被调用之后,在函数体中 执行完相应的程序,并最终返回给主调函数的值。 对于函数的返回值(或称函数的值),需要注意 如下几点说明:
第11章C51的函数
11.1 函数的概念和分类
• 函数是能够实现特定功能的代码段。一个C51程序通常由一个主函 数和若干个函数构成。其中,主函数即main()函数。C51程序的执 行总是从main函数开始,完成对其他函数的调用后再返回到主函 数,最后由main函数结束整个程序。一个C51源程序必须有,且只 能有一个主函数main()。
• 函数名(实参列表) • 其中,函数名即被调用的函数,实参列表是主调函数传递
给被调函数的数据。通常,函数可以有以下3种调用方式。 • 函数语句:把函数作为一个语句,主要用于无返回值的函
数。示例如下: • delay(); • 函数表达式:函数出现在表达式中,主要用于有返回值的
函数,将返回值赋值给变量。示例如下: • c=min(x,y);
//函数min求x、y中的最小值 • 函数参数:函数作为另一个函数的实参,主要用于函数的
嵌套调用。示例如下: • c=min(x,min(y,z));
//函数min求x、y、z中的最小值
11.5.1 赋值调用与引用调用
• 赋值调用与引用调用是C51语言中最常用的参数传 递方式,下面分别进行介绍。
• “赋值调用”(call by value),这种方法中函 数的形参是数值变量,函数调用时把参数的值复 制到函数的形式参数中。赋值调用不会影响主调 函数中的变量的数值。
义。 • 函数之间允许相互调用,也允许“嵌套调用”。 • 函数还可以自己调用自己,称为“递归调用”。 • main()函数是主函数,它可以调用其他函数,而不允许被其他函
数调用。 • 在C51语言中,可从不同的角度对函数分类,下面分别进行介绍。
11.1.3 从数据传送角度
• 从主调函数和被调函数之间数据传送的角度来划分,又可 把C51函数分为无参函数和有参函数两种。分别介绍如下。
• C51中一个函数对其他函数的调用是全程的,对于整个工程 都是“可见”的,即使两个函数在不同的文件中,也不必 附加任何说明语句而被另一函数调用。
11.6.2 函数的变量作用域
• 函数的变量作用域是指函数内部定义的变量的使用范围。C51中的变量是 可以在各个层次的函数开头处加以说明的,它的作用域仅在本函数内,当 函数执行完毕后,变量及其分配的内存将消失。由于作用域的不同,一个 函数中的变量即使与另一个函数中的变量名字相同,它们之间也是互不干 扰的。这里举例讲解函数的变量作用域,程序示例如下:
• 在程序中除了对函数的调用以外,其他任何函数中的任何 语句都不能访问它。例如,使用跳转语句goto,也只能在 本函数内部使用,而不能从一个函数跳进其他函数内部执 行。
• 定义在一个函数内部的数据无法与定义在另一个函数内部 的数据进行作用,除非使用全程变量。
• C51中所有函数的作用域都处于同一级别上,不可以在一个 函数内再说明或定义另一个函数。
• “引用调用”(call by reference),这种方法 中函数的形参是指针,函数调用时是把参数的地 址复制给形式参数。在函数中,这个地址用来访 问调用中所使用的实际参数。引用调用将会影响 主调函数中的变量的数值。
11.5.2 递归调用
• 递归调用一个函数在它的函数体内调用它自身的函数调用 方式。这种函数也称为“递归函数”。在递归函数中,主 调函数又是被调函数。执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
• 2.数组名作为函数参数:数组名作为函数参数是指在发生函数调 用时,把作为实参的数组名传送给形参,实现单向的值传送。
• 在普通变量或数组元素作函数参数时,形参变量和实参变量是由 编译系统分配的两个不同的内存单元。在函数调用时发生的值传 送是把实参变量的值赋予形参变量。而在用数组名作函数参数时, 不是把实参数组的每一个元素的值都赋予形参数组的各个元素, 只是将实参数组的首地址赋予形参数组名。形参数组名取得该首 地址之后,也就等于有了实在的数组。实际上是形参数组和实参 数组为同一数组,共同拥有一段内存空间。
11.3.3 多维数组作为函数参数
相关文档
最新文档