V o.l 23,N o .42007
第4期
NATURAL SCIENCES J OURNAL OF HARBIN NORM AL UN I V ERS I TY
深入探讨C++语言中参数传递问题
刘志华
(哈尔滨广播电视大学)
摘要 C++语言程序设计中函数调用中的参数传递是非常重要的内容,不
同类型的参数传递的方式也不相同,在开发项目编写程序中,选择合适的参数进行传递,将使你的程序简洁清晰,运行效率提高.
关键词:C ++语言;函数调用;参数传递
收稿日期:2007-04-02
0 引言
函数是C++语言程序中的基本功能模块和执行单元,C ++语言程序的功能可以通过函数之间的调用来实现,C ++函数分为标准函数(库函数)和用户自定义函数,一个完整的C ++语言程序是由一个或多个函数组成的.C ++语言中的函数相当于其他语言中的子程序.
定义函数的目的是使用它,而函数的使用就是进行函数调用.调用一个函数就是暂时中断现有程序的运行,转去执行被调用函数,当被调用函数执行结束以后,在返回到中断处继续执行的过程.
当调用一个函数时,整个调用过程分为三步进行,第一步是参数传递;第二步是函数体执行,第三步是返回,即返回到函数调用表达式的位置.参数传递称为实虚结合,即实参向形参传递信息,使形参具有确切地含义(即具有对应的存储空间和初值).这种传递又分为两种不同情况,一种是向非引用参数传递;另一种是向引用参数传递.
形参表中的非引用参数包括普通类型的参数、指针类型的参数和数组类型的参数三种.实际
上可以把数组类型的参数归为指针类型的参数.
当形参为非引用参数时,实虚结合的过程为:
首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的长度,然后把已求出的实参表达式的值存入到为形参变量分配的存储空间中,成为形参变量的初值.这种传递是把实参表达式的值传送给对应的形参变量,称这种传递方式为!按值传递∀.
当形参为引用参数时,对应的实参通常是一个变量,实虚结合的过程为:把实参变量的地址传送给引用形参,成为引用形参的地址,也就是说使得引用形参是实参变量的一个引用(别名),引用形参所占用的存储空间就是实参变量所占用的存储空间.因此,在函数体中对引用形参的操作实际上就是对被引用的实参变量的操作.这种向引用参数传递信息的方式称为!引用传送∀或!按址传送∀.
1 简单变量作参数
简单变量包括整型、浮点型、字符型等,在调用一个函数时,将实参的值传给形参的方式来传递信息,形式参数和实在参数有各自不同的内存
方式称为!按值传递∀,在这种传递方式下,在函数体中对形参的修改不会影响实在参数的值,因为它们使用各自的存储空间.
下面的例子是简单变量作参数,调用s w ap函数同时把x的值传送给形参a,把y的值传送给形参b,在函数体中对形参a和b的操作是与对应的实参x与y无关的,因为它们使用各自的存储空间.
#inc l u de
vo id s w ap(i n t a,int b)
{int te m p;te m p=a;a=b;b=te m p;}
vo id m a i n()
{int x=45;i n t y=12;
cout<<∀调用函数前:∀<<∀x=∀< cout<<∀调用函数后:∀<<∀x=∀< 调用函数前:x=45y=12 调用函数后:x=45y=12 2指针作参数 指针本身是一个变量,它的特殊之处在于它的值是一个地址,因而可以通过指针来间接访问另外一个内存地址,这个地址一般是另一个变量存放变量值的地方.当函数的形式参数是指针时,它的实在参数的值必须是一个地址.下面的例子是通过指针来交换两个变量的值.由于指针作形参,因此对应的形参和实参共用同一个内存单元,形参值的改变将影响实参值. #inc l u de vo id s w ap(i n t*a,int*b) {int te m p;te m p=*a;*a=*b;*b=te m p;} vo id m a i n() {int x=45;i n t y=12; cout<<∀调用函数前:∀<<∀x=∀< cout<<∀调用函数后:∀<<∀x=∀< 调用函数前:x=45y=12 调用函数后:x=12y=453引用作参数 下面的例子是通过引用来交换两个变量的值.由于引用作形参,因此对应的形参和实参就是同一个内存单元,形参值的改变也将影响实参值. #inc l u de vo id s w ap(i n t&a,int&b) {int te m p;te m p=a;a=b;b=te m p;} vo id m a i n() {int x=45;i n t y=12; cout<<∀调用函数前:∀<<∀x=∀< cout<<∀调用函数后:∀<<∀x=∀< 调用函数前:x=45y=12 调用函数后:x=12y=45 引用传送的好处是不需要为形参分配新的存储空间,从而节省存储,另外能够使对形参的操作反映到实参上,函数被调用结束返回后,能够从实参中得到函数对它的处理结果.有时,既为了使形参共享实参的存储空间,又不希望通过形参改变实参的值,则应当把该形参说明为常量引用,如: vo id f13(const in&t A,const Node*&B,char C); 在该函数执行时,只能读取引用形参A和B 的值,不能够修改它们的值.因为它们是对应实参的别名,所以,也可以说,只允许该函数使用A和B对应实参的值,不允许进行修改,从而杜绝了对实参进行的有意或无意的破坏. 4数组作参数 #inc l u de const i n t N=8; i n t sum(int a[],i n t n); vo id m a i n() {int b[N]={1,7,2,6,4,5,3,-2}; i n t m1=su m(b,8);i n t m2=sum(&b[2], 5);i n t m3=sum(b+3,3); cout< {int i,f=1; 哈尔滨师范大学自然科学学报2007年 for(i =0;i = * a ++;return f ;}该函数包含一个主函数和一个su m 函数,sum 函数的功能是求出一维整型数组a [n ]中所 有元素之积并返回.在主函数中第一次调用sum 函数时,把数组b 的首地址传送给a ,把数组b 的长度8传送给n ,执行函数体对数组a 的操作实际上就是对主函数中数组b 的操作,因为它们同时指向数组b 的存储空间;第二次调用sum 函数是把数组b 中b [2]元素的地址传送给a ,把整数5传送给n ,执行函数体对数组a [n ]的操作实际上是对数组b 中b [2]至b [6]之间元素的操作;第三次调用su m 函数是把数组b 中b [3]元素的地址传送给a,把整数3传送给n,执行函数体对数组a [n ]的操作实际上是对数组b 中b [3]至b [5]之间元素的操作.该程序的运行结果为:-10080 720 120 在函数定义的形参表中说明一个数组参数时,通常还需要说明一个整型参数,用它来接收由实参传送来的数组的长度,这样才能够使函数知道待处理元素的个数. 5 字符串作参数 #inc l u de char *sss(char *sp ,char * dp);vo id m a i n () {char a [15]="abcadecaxybc w ";char b [15];char * c 1=sss(a,b );cout< sss(char * sp ,char * dp) {if(* sp='\\0)'{* dp='\\0;'re t u rn dp ;}int i =0,j ;for(char * p=sp ; * p ;p++){//扫描sp 所指 字符串中的每个字符位置 for(j =0;j if(* p=dp[j ])break ;//当* p 与dp[0]至dp[i -1]之间的任一元素相同则比较过程结束if(j >=i )dp[i ++]=* p ;//若dp 数组的前i 个元素均不等于*p ,则把* p 写入dp[i ]元素中}dp[i ]='\\0;'//写入字符串结束符 return dp ;} sss 函数的功能是把sp 所指向的字符串,去掉重复字符后拷贝到dp 所指向的字符数组中,并返回dp 指针.在主函数中第一次调用sss 函数时,分别以a 和b 作为实参,第二次调用时分别以a +4(即a[4]的地址)和b 作为实参.该程序运行后的输出结果为: abcdexy w abcadecaxybc w abcdexy w decaxybw abcadecaxybc w decaxybw 进行函数调用除了要把实参传递给形参外,系统还将自动把函数调用表达式执行后的位置(称为返回地址)传递给被调用的函数,使之保存起来,当函数执行结束后,将按照所保存的返回地址返回到原来位置,继续向下执行. 参 考 文 献 1 王萍.C ++面向对象程序设计[M ].北京:清华大学出版社, 2002. 2 徐孝凯.电大在线网上资源[J].北京:C++语言程序设计辅导,2004. 3 郑莉,董渊,等.C ++语言程序设计[M ].北京:清华大学出版社,1999. PROBI NG I NTO THE QUESTI ON OF PARA M ETER TRANS M ISSI ON I N THE C ++LANGUAGE PROGRA MM I NG L i u Zh i h ua (H arb i n Rad i o and Televisi on Un ivers i ty) ABSTRACT In the C ++language prog ra mm i n g the function transfers the para m eter trans m issi o n is the count for m uch conten,t the d ifferent type para m eter trans m issi o n w ay is not sa m e ,in the deve l o pm ent pro ject co mp ila ti o n app lication pr ocedure ,chooses the appr opriate para m eter to carry on the trans m issi o n ,w ill cause your procedure succinctl y to be clear ,the operati n g effic i e ncy greatly w ill enhance . K eyw ords :C ++language progra mm ing ;Function transfer ;Para m eter trans m ission (责任编辑:红) 65 第4期 深入探讨C ++语言中参数传递问题