四讲函数及变量的作用域.ppt
《四讲函数及变量的作用域.ppt》由会员分享,可在线阅读,更多相关《四讲函数及变量的作用域.ppt(64页珍藏版)》请在三一文库上搜索。
1、第四讲 函数及变量的作用域,函数的定义和说明 函数的调用 函数的参数 内联函数 函数重载 函数的嵌套调用和递归调用 作用域 C+的系统函数,主要内容,4.1 函数的定义和说明,函数的定义格式 函数的说明方法,一个C+函数由函数头与函数体两部分组成。 形式如下: 函数类型 函数名(形式参数类型 形式参数名,) 函数体 如: int fun1(char c,float f) int m=1; m+=c+f; return m; ,函数的定义格式,即函数返回值的类型。无返回值为void类型,语句序列。描述了实现功能的过程,并一般要最后执行一条return语句。,可包含多个形式参数。定义了函数将从调用
2、函数中接收多少个数据及其类型,返回语句的形式为: return 表达式; 这时表达式的结果就是函数的返回值,也称函数值。 即返回的不是函数本身,而是一个值。 若函数所执行的功能不需要返回数据,则可缺省 return语句。如: void spc (int n) for (int I=0; In; I+) cout“*“; 注意:函数类型为void,若无默认为int。 C+不允许函数定义嵌套。,函数的说明方法,其形式为:函数类型 函数名(参数类型表); 如: int absolute_value ( int ,double); 要求在调用函数前让编译器知道其函数原型,以便编译器利用函数原型提供的信
3、息来检查调用的合法性,强制参数为适当类型,保证参数的正确传递。 而编译器获得函数原型有两种情况: ()当函数定义在调用之前时,则从定义中抽取函数原型。 ()当函数定义在调用之后时,则程序员须在调用之前用函数原型对函数进行声明,让编译器获得函数原型。,即所有参数的数据类型,对于标准库函数的函数原型都在头文件中提供了,程序可用#include命令包含进来即可; 注意:函数原型和函数定义在返回类型、函数名和参数表上必须完全一致,否则编译错误。,注 意,#include void f1 ( ) ; /函数说明 void f2 ( ) ; void main( ) f1( ); /函数调用 f2( );
4、 void f1( ) /函数定义 cout “Function f1.n“;f2( ); void f2( ) cout “Function f2 .n“;,main(),f1(),f2(),4.2 函数的调用,函数的值和类型 函数的传值调用 函数的引用调用,函数的值和类型,函数调用通过调用表达式进行。 表达式形式为:函数名(实参表列) 函数调用过程是: 为形参及函数体中的变量分配存储空间; 用实参向形参传递数据; 中断现行(调用)函数,将控制转交给被调用函数执行。 函数调用后的返回过程是: 先计算出返回语句中的值 若表达式值的类型与函数类型不一致,则强制转换。 将计算出的表达式值返回给调用
5、函数作为返回值。 将控制由被调用函数转向调用函数,执行后面的语句。,如: #include int lmax(int,int); /函数声明 void main( ) int limit=32; char ch=A; long mval; mval=lmax(limit,ch); /调用表达式 coutb?a:b); ,实参的个数、类型及顺序要与形参保持一致,形式参数,实际参数,说明: (1)实参在进行函数调用时,必须具有确定的值,以便把这些值传送给形参。 (2)形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。 因此,形参只有在该函数内有效。调用结束,返回调用函数
6、后,则不能再使用该形参变量。 (3)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 (4)实参和形参占用不同的内存单元,即使同名也互不影响。,函数的传值调用,C+中变量值有两种:变量本身值和变量地址值。而形参的类型也就分为两种:一般类型和指针类型。 则传值调用的方式也有两种:传值调用和传址调用 有时也称:直接调用与间接调用,1、传值调用的实现机制和特点,实现机制是:调用函数中的数据只是在调用之初通过实参向形参传递,之后各占有不同的空间,并且不再发生联系,互不干扰。 特点是:形参值的改变不影响实参。 实参本身的值在调用前后和调用过程中都不发生变化。,
7、函数swap本想实现交换a和b值的功能,但调用结果却不如意。原因就在于这种调用是一种值调用。 例:#include void swap(int,int); void main( ) int a=3,b=5; cout“before swap :a=“a“,b=“bendl; swap(a,b); cout“after swap :a=“a“,b=“bendl; void swap(int a,int b) int temp; temp=a; a=b; b=temp; cout“in swap :a=“a“,b=“bendl; ,调用swap时,内存单元分配情况:,3,5,3,temp=a; a
8、=b; b=temp;,实现机制是:实参为某变量地址值,形参为指针类型。在调用时,将地址值赋给形参,使形参指针指向该变量。则以后可直接通过形参指针来访问该变量。 特点是:可通过改变形参所指向的变量值来影响实参所对应的变量值。,2、传址调用的实现机制和特点,函数swap实现了交换a和b值的功能。原因就在于这种调用是一种传址调用。 例:#include void swap(int *,int *); void main( ) int a=3,b=5; cout“before swap :a=“a“,b=“bendl; swap( ,调用swap时,内存单元分配情况:,3,5,3,temp=*a;
9、*a=*b; *b=temp;,函数的引用调用,使用引用作为函数形参时,调用函数的实参要用变量名。将实参变量名赋给形参的引用,则在被调函数中,对引用的操作,实质就是直接通过引用来操作实参的变量值。 显然,引用传递方式具有传址调用的效果,又有传值调用的语法简单性和可读性。 注意: 若只从调用语句观察,是无法区别采用的是传值调用还是引用调用。,函数swap实现了交换a和b值的功能。这里调用是采用了引用调用。 例:#include void swap(int ,调用swap时,内存单元分配情况:,3,5,3,temp=a; a=b; b=temp;,4.3 函数的参数,函数参数的求值顺序 设置函数参
10、数的默认值 使用数组作函数参数,函数参数的求值顺序,由于使用不同求值顺序的编译器而造成二义性。 #include int add(int x,int y); /函数声明 void main( ) int a=4,b=6; int z=add(+a,a+b); /从左至右为5 11 coutzendl; /从右至左为5 10 int add(int x,int y) /函数定义(实现) return x+y; ,设置函数参数的默认值,在函数说明语句中预先初始化一些参数的值,从而使调用语句中相应的参数可以缺省。 如: int max(int, int, int=-32768); 则在函数调用时可以
11、不给最后一个参数传递值,而采用缺省值。如: max(i1,i2); / 参数缺省调用 max(i1,i2,i3); /正常调用 允许函数默认参数值,是为了让编程简单。 设置函数参数的默认值是按从右至左的方式 当又有声明又有定义时,定义中不允许默认参数。若只有定义,则默认参数才可出现在函数定义中。,注意:若一个函数中有多个默认参数,则参数缺省按从后向前的顺序进行, 如: void fun(int a=3,int,char c=a); /error 当调用函数时,也只能从右向左匹配参数。 如: 声明函数为: void func(int a,int b=2,int c=3,int d=5); 则调用
12、方法: func(2,15, ,3); / error,使用数组作函数参数,1、形参和实参都用数组 这种调用的机制是:形参和实参共用内存中的同一个数组空间。因此,在被调用函数中改变了数组中某个元素的值,对调用函数该数组的该元素值也被改变,因为是共用同一个数组。 #include int a8=1,3,5,7,9,11,13; void fun(int b ,int n) for (int I=0;In-1;I+) b7+=bI; void main( ) int m=8; fun(a,m); couta7endl; ,#include void invert(char b,int n); vo
13、id main() char s60; int n; couts; cout“字符串原始顺序:“sendl; n=strlen(s); invert(s,n); cout“字符串反转后的顺序:“sendl; void invert(char b,int n) for(int i=0;in/2;i+) char c=bi; bi=bn-1-i; bn-1-i=c; ,输入一字符串个数,反序存放并输出,不能写成invert(sn,n),有问题吗?,2、形参和实参都用对应数组的指针 实际,也可一个使用指针,另一个使用数组。在使用指针时,可以直接用数组名,也可用另外定义的指向数组的指针。 #inclu
14、de int a8=1,3,5,7,9,11,13; void fun(int *pa,int n) /函数声明与定义 for (int I=0;In-1;I+) *(pa+7)+=*(pa+I); void main( ) int m=8; fun(a,m); couta7endl; ,#include void invert(char *b,int n); void main() char s60; int n; /char *p=s; couts; cout“字符串原始顺序:“sendl; n=strlen(s); invert(s,n); / invert(p,n); cout“字符串
15、反转后的顺序:“sendl; void invert(char *b,int n) for(int i=0;in/2;i+) char c=*(b+i); *(b+i)=*(b+n-1-i); *(b+n-1-i)=c; ,输入一字符串个数,反序存放并输出,3、形参用引用实参用数组名 其中要先用类型定义语句定义一个int型的数组类型。 typedef int aref8; /类型定义 int a8=1,3,5,7,9,11,13; void fun(aref ,#include typedef char arr60; /先用类型定义一个char型的数组类型 void invert(arr ,输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 变量 作用
链接地址:https://www.31doc.com/p-3214182.html