嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者 华清远见嵌入式学院 冯利美 冯建 第8章 函数

上传人:E**** 文档编号:89409226 上传时间:2019-05-24 格式:PPT 页数:42 大小:329.50KB
返回 下载 相关 举报
嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者  华清远见嵌入式学院 冯利美 冯建 第8章 函数_第1页
第1页 / 共42页
嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者  华清远见嵌入式学院 冯利美 冯建 第8章 函数_第2页
第2页 / 共42页
嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者  华清远见嵌入式学院 冯利美 冯建 第8章 函数_第3页
第3页 / 共42页
嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者  华清远见嵌入式学院 冯利美 冯建 第8章 函数_第4页
第4页 / 共42页
嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者  华清远见嵌入式学院 冯利美 冯建 第8章 函数_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者 华清远见嵌入式学院 冯利美 冯建 第8章 函数》由会员分享,可在线阅读,更多相关《嵌入式Linux C语言程序设计基础教程 教学课件 ppt 作者 华清远见嵌入式学院 冯利美 冯建 第8章 函数(42页珍藏版)》请在金锄头文库上搜索。

1、第八章 函数,www.embedu.org,本章的要求,掌握函数的基础知识 掌握指针函数 熟悉函数指针 掌握递归函数,www.embedu.org,函数基础,函数 函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。 一般形式如下: ( ) 语句序列; return(); ,www.embedu.org,函数基础,其中: 是一个标识符,要求符合标识符的命名规则; 是整个函数的返回值类型,如无返回值应该写为void型; 是逗号”,”分隔的多个变量的说明形式,通常简称为形参; 大括弧对 ,称为函数体; 是大于等于零个语句构成的。 注意:在函数体中,表达式语句里使用的变

2、量必须事先已有说明,否则不能使用。,www.embedu.org,函数基础,return()语句中表达式的值,要和函数的保持一致;如函数的为void可以省略或者无表达式结果返回(即写成return ;)。 例:定义求xn值的函数( x是实数, n为正整数)。 double Power(double x, int n) if( n0 ) printf(“errorn”); return(-111); /如果是负整数,返回-111作为出错的状态值 int i; double r=1; /定义一个double型变量用以存放结果,并初始化为1 for( i=1; i=n; i+) r *= x; re

3、turn( r ) ; /要求返回double型结果值为r ,www.embedu.org,int main(void) double a,b; int c; while (scanf(“%lf%d“, ,www.embedu.org,函数基础,函数的说明 函数的说明就是指函数原型 其中,可以缺省说明的变量名称,但类型不能缺省。 例如, double Power(double x, int n) ; double Power(double, int);,www.embedu.org,函数基础,函数的使用 函数的使用也叫函数的调用,形式如下: 函数名称(实际参数) 其中: 是一个标识符,符合标识

4、符的命名规则; 实际参数需要确切的数据,也可以是具有确定值的表达式。实参就是在使用函数时,调用函数传递给被调用函数的数据,用以完成所要求的任务。 注意: 函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句。对于无返回值的函数来讲,只能形成一个函数调用语句。,www.embedu.org,函数基础,编写一个函数显示 “Hello, guy! ”,然后编写 主程序main调用它。 #include void DisplayHello(void) printf(“Hello,guy!n”); int main(void) DisplayHello() ; /一个函数调用语句 运行结果:

5、 Hello, guy! ,www.embedu.org,函数基础,驱动程序的初始化 include/linux/init.h #define module_init(x) _initcall(x); #define _initcall(fn) device_initcall(fn) #define device_initcall(fn) _define_initcall(“6“,fn) #define _define_initcall(level,fn) static initcall_t _initcall_#fn _attribute_used_ _attribute_(_section

6、_(“.initcall“ level “.init“) = fn,www.embedu.org,函数基础,嵌入式linux典型例子 arch/arm/mm/mm-armv.c static void _init create_mapping(struct map_desc *md) mm/page_alloc.c static int _init build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist, int j, int k) mm/vmalloc.c struct vm_struct *_get_vm_area(

7、unsigned long size, unsigned long flags, unsigned long start, unsigned long end) ,www.embedu.org,函数基础,函数之间的参数传递有: 复制传递方式 地址传递方式 全局变量,www.embedu.org,函数基础,复制传递方式 复制传递方式是函数间传递数据常用的式。调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化。即把实参赋给一个新的变量,把实参复制到新建形参的存储区域中。采用复制传递方式传递数据,被调用函数不能访问调用函数里的实参。被调用函数处理的数据是复制到其形参的数据,因

8、此,即使改变形参的值也不会影响实参的值,一旦被调用函数完成了其任务时,这些形参通常就释放其占用空间 。,www.embedu.org,函数基础,复制传递方式的示意图: 上图中,虚箭头线是指将实参的数据拷贝给了形参变量,实参和形参是具有相同数据类型但存储空间是不同的两组空间。被调用函数处理的数据是复制到本地的数据,它不能改变调用函数中实参的数值 。,实参x1,形参y1,实参xn,形参yn,www.embedu.org,函数基础,地址传递方式 地址传递方式和复制传递方式正好相反,这种方式是将调用函数的参数本身传给被调用函数。因此,被调用函数中对形参的操作,将直接改变实参的值。调用函数将实参的地址传

9、送给被调用函数,被调用函数对该地址的目标操作,相当于对实参本身的操作。按地址传递,实参为变量的地址,而形参为同类型的指针。,www.embedu.org,函数基础,采用地址传递方式的数据交换例子。 #include void Swap(double *x, double *y) ; / Swap函数声明 int main(void) double x1, x2; x1=21.56; x2=65.12; Swap( ,www.embedu.org,函数基础,void Swap(double *x, double *y) /实现x和y指向的目标 double temp; temp= *x; *x

10、= *y; *y=temp; 运行结果: x1=65.12 x2=21.56,www.embedu.org,函数基础,全局变量 全局变量就是在函数体外说明的变量,它们在程序中的每个函数里都是可见的。实际上,全局变量也是一种静态型的变量。将它初始化为0。全局变量一经定义后就会在程序的任何地方可见。使用全局变量传递数据的先后顺序的不同会影响计算结果,应用顺序不当,会导致错误,这种方式尽量少用。,www.embedu.org,函数基础,全局变量实现函数之间数据通信的例子。 #include int n ; /定义一个全局变量n; double factorial (void) ; / 说明了一个do

11、uble型的函数factorial int main(void) double s=0; n=10 ; s = factorial( ); printf(“%en”,s); /调用factorial函数; double factorial (void) /factorial函数功能为计算n! ; double r = 1; int i; for(i=1; i=n; i+) r *= i; return( r ) ; 运行结果: 10!=3.6288e+06,www.embedu.org,函数基础,函数与数组 前面介绍了函数之间的参数传递都是基本数据类型的数据,本节将介绍数组在函数与函数间的传递

12、。与上一节介绍的一样, 数组作为参数在函数间的传递也有复制传递方式、地址传递方式和全局数组传递方式。,www.embedu.org,函数基础,复制传递方式 函数与函数之间的数组传递,复制传递方式只是提供一种形式,被调用函数的形参数组的数组名实际上是一个指针变量,因此,复制传递方式与数组的指针传递方式完全相同,只是形参的说明形式不同而已。调用函数将实参数组传递给被调用函数形参,形参接收是实参的地址。由于复制传递方式与下节介绍的指针传递方式一样,被调用函数里对形参数组的操作会影响调用函数里的实参数组。形参数组的说明形式好像是实参的备份,其实不然。,www.embedu.org,函数基础,数组复制传

13、递的例子。 #include double TestArray(double b,int Size); int main(void) int i; double a5=1.1, 2.1, 3.1, 4.1, 5.1, r=0; r= TestArray(a,5); printf(“%fn”,r); /输出r r=0; /在主函数中求出a数组的元素之和 for(i=0; i5; i+) r += ai; printf(“%fn”,r); ,www.embedu.org,函数基础,double TestArray(double b, int Size) double s=0; int i; for

14、( i=0; iSize; i+) s += bi; b4=0; return(s); 运行结果: Result = 15.5 r = 10.4,www.embedu.org,函数基础,地址传递方式 函数与函数之间数组的地址传递方式是将调用函数中的实参数组的起始地址传递给被调用函数的指针变量形参。因此,被调用函数中对形参地址的目标操作,相当于对实参本身的操作,将直接改变实参数组的值。地址传递方式,实参应该为数组的指针,而形参应为同类型的指针变量。另外,数组的地址传递方式不仅要把实参数组的指针作为参数传递给函数,同时还需要传递数组的长度。,www.embedu.org,函数基础,函数间数组地址传

15、递方式的例子。 #include double TestArray(double *pa, int Size); /函数说明 int main(void) double a5=1.1, 2.1, 3.1, 4.1, 5.1, r=0; r=TestArray(a,5); /将数组传递给函数 printf(“%.2fn”,r); double TestArray(double *pa, int Size) /形参为一个指针 int i; double s=0; for(i=0; iSize; i+) /注意:这里的pai就是ai s += pai; return(s); 运行结果: Sum=15.5 ,www.embedu.org,函数基础,多维数组与函数 多维数组作为参数在函数间的传递也有复制传递方式、地址传递方式和全局数组传递方式。,www.embedu.org,指针函数,指针函数是指一个函数的返回值为地址量的函数。通常一个函数都有返回值的数据类型。如果一个函数没有返回值,则该函数是一个无值型函数。指针函数只不过是一个函数的返回值是某一数据类型变量的地址。 指针函数的定义的一般形式如下: *() 语句序列;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号