视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
深入探讨C++语言中参数传递问题
2025-09-29 18:14:39 责编:小OO
文档
第23卷哈尔滨师范大学自然科学学报

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=∀<s w ap(x,y);

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=∀<s w ap(&x,&y);

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=∀<s w ap(x,y);

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<i n t sum(int a[],i n t n)

{int i,f=1;

哈尔滨师范大学自然科学学报2007年

for(i =0;i =a [i];//或写成f *

=

*

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<char *

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 ++语言中参数传递问题下载本文

显示全文
专题