1、关于形参与实参的区别与理解

在弄清形参与实参的时候,遇到了这样一段代码,表示不能理解,网上找了一下,摘录了原文解释 

int a=1;
int &b = a;

这是C++的引用,引用只能在定义的时候被赋值,这个定义的意思就是给a取了一个别名叫b,所有对b的操作都是直接作用于a

一个最简单的用法:
比如我写了个变量,名字非常长

int a_very_very_very_long_variable = 1;


我在后面的代码中要对这个变量进行操作,每次要打这么长的名字非常累,怎么办?用引用

int &x = a_very_very_very_long_variable;


然后操作x = 3;这时候a_very_very_very_long_variable的值就变成3了。

可能是被c语言中的取地址符给弄混了,我一时间竟然无法理解得了,但是学习总是一步一步来的,先牢牢记住吧,后面还用得到这个。

我觉得只要明白了值传递和地址传递(引用传递),就应该能明白形参和实参的具体工作细节了。

1、值传递(摘录原文:https://blog.csdn.net/JianZuoGuang/article/details/78727790 )

这个简单,平常我这个见得多,也用的多,所以理解起来也容易。调用时,将实参的值传递对应的形参,即为值传递。由于形参有自己独立的存储空间,又作为函数的局部变量使用,因此在函数中对任何形参值得修改都不会改变实参变量的值(有一些图文是从其他地方借鉴过来的,因为作为自己的学习理解博文,有的时候就会借鉴的东西比较多了,就不一一的写出转载地址了)

编译后,输出结果如下所示:

从上图可以看出,主函数声明了两个全局变量a,b并对其赋值1,2;通过函数Swp()函数调用之后,在函数内部将a和b的值交换了,使得函数内,a=2,b=1;但是,这个过程并没有改变全局变量a和b的值。

我们分析一下函数的调用过程:函数Swap()被调用前,实参a和b有自己的存储空间,并且有自己的初始值。当调用函数Swap()时,为形参(即函数的参数)x和y分配存储空间,并将a和b的值复制过来,函数执行过程中,将x和y的值进行交换,当函数执行结束之后,x和y所占用的存储空间将被释放,这种传递的方式,并不会对实参a和b的值产生影响,此即为值传递。(不知道为什么总感觉之前有做什么题目就是直接这样调用函数交换数据,java里面的?学的有点混了。总之这里的意思是函数内部ab交换了位置,但在主函数中的ab数值没有发生改变,所以打印出来还是原来的值)

2.引用传递

    引用传递是一种特殊的变量,它被认为是一个变量的别名。当定义一个引用时(&b),其实是为目标变量(a)起一个别名,引用并不分配独立的内存空间,它与目标变量公用其内存空间,当定义一个引用时,如果该引用不是用作函数的参数或者返回值,则必须提供该引用的初始值(即必须提供引用的目标变量名)如图:

b变量引用了a变量,可知a和b的值相等,均公用同一块内存地址,即变量b是a变量的一个别名。

将上面的值传递的示例代码修改为引用传递如下图所示:

编译运行,输出结果如下所示:

当函数未调用之前,实参a和b的值分别为1和2。当函数调用过程中,形参的值被交换,即a=2,b=1;函数调用结束之后,实参的值被改变。即函数调用时,作为形参的引用变量并不分配新的内存空间,它将作为实参变量的别名与其共用内存。

    说明:使用引用参数可以直接操作实参变量,从而能够实现通过修改形参的值而达到修改对应实参值得目的。当引用作为函数形参,其引用的目标变量没人为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初始值。(个人理解为,在被调函数中的int &x,int &y,从主函数中传入a,b。实则为int &x=a,int &y=b,这样就创建了ab的引用变量,当xy值发生改变时,ab实参的值也会随之改变。)

再说说实参与形参的区别:

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 

形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。

1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回,主调函数后则不能再使用该形参变量。 

2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 

3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。 

4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。

 

  • 22
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值