函数参数及其传递_第1页
函数参数及其传递_第2页
函数参数及其传递_第3页
函数参数及其传递_第4页
函数参数及其传递_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、 1.函数的参数函数的参数1)包括形式参数和实际参数包括形式参数和实际参数l形式参数是用逗号分隔的变量说明列表,形式参数是用逗号分隔的变量说明列表,这些变量称为函数的形式参数,有时也简这些变量称为函数的形式参数,有时也简称为形参。形式参数用于接收从函数调用称为形参。形式参数用于接收从函数调用程序传给这个函数的数据。程序传给这个函数的数据。l实际参数是用逗号分隔的表达式列表,实际参数是用逗号分隔的表达式列表,其中每一个表达式称为实际参数,有时其中每一个表达式称为实际参数,有时也简称为实参。在函数调用时,需要将也简称为实参。在函数调用时,需要将实参的值传送给对应位置的形式参数,实参的值传送给对应位

2、置的形式参数,因而要求实参个数必须和形参个数相同因而要求实参个数必须和形参个数相同(缺省参数或可变数目参数情况例外),(缺省参数或可变数目参数情况例外),并且实参的类型必须与对应的形参类型并且实参的类型必须与对应的形参类型相匹配。相匹配。2)关于形参与实参的说明关于形参与实参的说明函数中的形参变量函数中的形参变量,在未出现函数调用时在未出现函数调用时,不不占内存存储单元。只有在发生函数调用时,占内存存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。调用结函数中的形参才被分配内存单元。调用结束后束后,形参所占的内存单元也被释放。形参所占的内存单元也被释放。实参可以是常量、变量或表达式

3、。如:实参可以是常量、变量或表达式。如:max(3,a+b),但要求它们有确定的值。,但要求它们有确定的值。在调用时将实参的值赋给形参变量。如在调用时将实参的值赋给形参变量。如果形参是数组名,则传递的是数组首地果形参是数组名,则传递的是数组首地址而不是变量的值。址而不是变量的值。在定义函数时在定义函数时,必须指定形参的类型。必须指定形参的类型。实参与形参的类型应一致。实参与形参的类型应一致。实参变量对形参变量的数据传递是实参变量对形参变量的数据传递是“值传值传递递”,即单向传递,只有实参传给形参,即单向传递,只有实参传给形参,而不能由形参传回来给实参。在内存中,而不能由形参传回来给实参。在内存

4、中,实参单元与形参单元是不同的单元。在调实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原参单元被释放,实参单元仍保留并维持原值。被调用函数的形参值的改变,并不改值。被调用函数的形参值的改变,并不改变主调函数的实参值。变主调函数的实参值。l函数参数传递包含两类:函数参数传递包含两类: 1)主调函数调用函数时,把执行参数传入)主调函数调用函数时,把执行参数传入到被调函数中。用传值到被调函数中。用传值/传地址方式来实现。传地址方式来实

5、现。 2)被调函数执行后,计算所得结果回传给)被调函数执行后,计算所得结果回传给主调函数。主调函数。 一般用一般用“return(表达式)(表达式)”或或“return表达式表达式”来实现。来实现。l这两种方式都可以用全局变量来实现。这两种方式都可以用全局变量来实现。2.函数参数传递函数参数传递3.函数参数传递方式函数参数传递方式 C语言提供了两种参数传递方式语言提供了两种参数传递方式l按值调用(按值调用(call by value)l按引用调用(按引用调用(call by reference)1) 按值调用按值调用l简称传值,又称拷贝调用,它只允许调用函简称传值,又称拷贝调用,它只允许调用函

6、数向被调用函数单向传送信息。数向被调用函数单向传送信息。l实际操作实际操作:取出实参值传入函数作形参值。取出实参值传入函数作形参值。l实质实质:实参和形参分别分配不同的存储单元。实参和形参分别分配不同的存储单元。l效果效果:在函数中对形参的修改不影响实参内在函数中对形参的修改不影响实参内容。容。l按值调用的好处:被调用的函数在执行按值调用的好处:被调用的函数在执行时对调用函数没有副作用,即被调函数时对调用函数没有副作用,即被调函数不会修改主调函数的数据,这是一种安不会修改主调函数的数据,这是一种安全的参数传递方式。,它减少了函数之全的参数传递方式。,它减少了函数之间的数据依赖,提高了函数的独立

7、性。间的数据依赖,提高了函数的独立性。按值调用举例:按值调用举例:l#includelvoid swap(int x ,int y) /实现实现X,Y的值交换的值交换l int t;l coutendlX=tY=yendl;l t=x; x=y; y=t; /X,Y的值交换的值交换l coutendlX=xtY=yendl;llvoid main( )l int a, b;l coutendla;l coutb;l coutnBefore swapping: A=a and B=bendl;l swap(a, b);l coutnAfter swapping: A=a and B=bendl;

8、l l 程序执行如下:程序执行如下:l Enter two numbers.l A=10 l B=20 l Before swapping: A=10 and B=20l X=10 Y=20l X=20 Y=10l After swapping: A=10 and B=20该程序未能成功地交换两个整数的位置,其原因在该程序未能成功地交换两个整数的位置,其原因在于程序错误地使用了按值调用。其示意图如下:于程序错误地使用了按值调用。其示意图如下: 2)按引用调用允许信息在两个函数之间双向按引用调用允许信息在两个函数之间双向传递传递引用类型:在其他数据类型后面加上一个引用类型:在其他数据类型后面加上

9、一个修饰符修饰符“&”,而该数据类型称为引用类型。,而该数据类型称为引用类型。 如:如:int& var; float& var; double& var; /var为一变量为一变量引用类型的含义:它不是创建一个新的对引用类型的含义:它不是创建一个新的对象象(或变量或变量),而是作为另一个对象,而是作为另一个对象(变量变量)的的别名,如:别名,如: int i=1; /声明了一个整形变量声明了一个整形变量i,且初始化为且初始化为1 int& ir=i; /引用变量必须初始化,指明引用变量必须初始化,指明ir是是i的别名的别名 引入引入ir作为作为i的别名

10、后,对的别名后,对ir的操作就相当于的操作就相当于作用在变量作用在变量i上。比如:上。比如: 定义了上述定义了上述i和和ir之后,执行之后,执行“ir=8;”语句语句 也就相当于将也就相当于将8赋值给赋值给i;即:;即: ir=8;与与i=8;效果相同。效果相同。注意注意“&”的作用的作用l作为类型修饰符,作为类型修饰符,“&”当作引用调用;当作引用调用;l作为一元运算符,求出变量的地址,如:作为一元运算符,求出变量的地址,如: int i; i=5; coutI=iendl; /输出输出i的值的值 coutn&i=&iendl; /输出变量输出变量i的地址的地

11、址 由此,可以将引用调用称为按地址传递。由此,可以将引用调用称为按地址传递。l作为二元运算符,进行位运算的与运算,如:作为二元运算符,进行位运算的与运算,如: int a, b, c; a=10; b=25; c=a&b; 按引用调用的例子按引用调用的例子 #include void swap(int&,int&); void main( ) int a, b; coutendla; coutb; coutnBefore swapping: A=a and B=bendl; swap(a, b); coutnAfter swapping: A=a and B=bendl

12、; void swap(int& x ,int& y) int t; coutendlX=tY=yendl; t=x; x=y; y=t; /X,Y的值交换的值交换 coutendlX=xtY=yendl; 程序执行如下:程序执行如下: Enter two numbers. A=10 B=20 Before swapping: A=10 and B=20 X=10 Y=20 X=20 Y=10 After swapping: A=20 and B=10 /交换成功交换成功该程序中该程序中A,B的值交换成功。这是由于程序用了按引用调的值交换成功。这是由于程序用了按引用调用,用,X

13、是是A的别名,的别名,Y是是B的别名,的别名,X和和Y不单独用存储空不单独用存储空间。执行间。执行swap后,局部变量后,局部变量t自动消失。示意图如下:自动消失。示意图如下: 引用的建立和使用的例子引用的建立和使用的例子#includevoid main( ) int a; /定义了一个整型变量定义了一个整型变量 int& ra=a; /建立一个引用建立一个引用ra,作为,作为a的别名的别名 a=8; coutnA=aendl; coutnRA=raendl; ra=58; coutnA=aendl; coutnRA=raendl; coutn&A=&aendl; c

14、outn&RA=&raendl;4.缺省参数缺省参数1)缺省值)缺省值lC允许在函数原型或函数定义中为形式允许在函数原型或函数定义中为形式参数指定具体的值,称缺省值(参数指定具体的值,称缺省值(default value)。l如果函数调用时指定了形式参数所对应的如果函数调用时指定了形式参数所对应的实际参数,则形式参数使用实际参数的值;实际参数,则形式参数使用实际参数的值;l如果函数调用时未指定形式参数所对应的如果函数调用时未指定形式参数所对应的实际参数,则形式参数使用缺省值。实际参数,则形式参数使用缺省值。2)缺省参数举例)缺省参数举例 #include#includedoub

15、le distance(double x1, double y1, double x2=0, double y2=0);/函数的原型声明,给出函数的原型声明,给出X2、Y2的初值的初值void main( ) cout(1,2) to (0,0) is distance(1,2)endl; cout(-1.5,2) to (1.5,-2) is distance(-1.5, 2, 1.5, -2)endl;double distance(double x1, double y1, double x2, double y2)/计算两点之间的距离计算两点之间的距离 double x, y; x=x

16、2-x1; y=y2-y1; return sqrt( (x*x)+(y*y) );此例在函数原型给出缺省值,主函数第一次调用时没有给出此例在函数原型给出缺省值,主函数第一次调用时没有给出x2,y2的实参值,使用了缺省值;主函数第二次调用时,分的实参值,使用了缺省值;主函数第二次调用时,分别给出了别给出了x1,y1,x2,y2的实参,按给出的实参计算的实参,按给出的实参计算3)缺省参数必须从函数参数中从右向左定义,)缺省参数必须从函数参数中从右向左定义,一个缺省参数的右边不能还有未指定的缺一个缺省参数的右边不能还有未指定的缺省值的参数。省值的参数。 l定义缺省参数时,既可在函数原型中给定义缺省

17、参数时,既可在函数原型中给出,也可在函数定义中给出,但必须是出,也可在函数定义中给出,但必须是在任何以缺省参数方式调用该函数之前,在任何以缺省参数方式调用该函数之前,而且在同一编译模块中不允许重复给出而且在同一编译模块中不允许重复给出缺省参数。(可以简单理解为在一个程缺省参数。(可以简单理解为在一个程序中不允许重复对一个函数给出缺省参序中不允许重复对一个函数给出缺省参数)数)l使用缺省参数的优点在于当需要多次调使用缺省参数的优点在于当需要多次调用一个函数,并且给这个函数传递某个用一个函数,并且给这个函数传递某个同样的参数值时可考虑使用缺省参数,同样的参数值时可考虑使用缺省参数,以方便使用。以方便使用。5.函数的嵌套调用函数的嵌套调用l一个函数被主

温馨提示

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

评论

0/150

提交评论