形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?
一. 形参与实参
1.先来一例子:
fun(int a)
{........}
Main ()
{
int b=0;
fun(b);
}
其中,a是形参,b是实参.
2.再看理论定义
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
函数的形参和实参具有以下特点:
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
二. 值传递与引用传递
1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
2.引用传递: 就是传了内存空间的地址, 行参实参公用一个地址的数据, 当函数内部需要修改参数,也将同时改变影响调用者。
归结起来,call-by-value方式的调用参数和被调用方法中的参数,是两个变量,代表两个不同的内存地址;而call-by-reference方式的调用参数和被调用方法中的参数,代表的是同一内存地址。从这个意义上理解两种参数传递方式,就是很容易的了。
传值的过程:
(1)形参与实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时存储区,然后将各实参之值传递给形参,这时形参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
传值的特点:单向传递,即函数中对形参变量的操作不会影响到调用函数中的实参变量。
地址传递过程:参数是地址,实参和形参共享一个存储单元(也可以理解将实参的地址赋值给形参),对形参的操作相应的就改变了实参,此时参数传递是双向的。
利用引用类型变量进行值传递:传递是原引用变量的副本,即把原引用变量复制一份传递给方法,使得方法中的行参和实参引用的值相同,指向同一个对象的实例;引用类型变量是以对象引用的形式传递的,是将要传递的对象的引用复制给函数的形参,这时形参是实参引用的复制,注意:是引用的复制,而不是原引用,和原引用指向相同的对象,因此对于引用对象所做的更改将会直接影响原来的值,但是对于引用本身,在函数内的任何改变将不会影响原引用。
利用引用类型参数进行引用传递:传递的是引用变量的引用,此时形参相当于是实参的一个别名,两者是同一个引用。
三.ref参数与out参数
1.两者都是引用传递.
2.区别在于:ref参数在调用方法前必须几经初始化。而out参数在调用方法前可以没有初始化,他们都以引用传递方式传递。
四.参考兄弟的帖子.
http://blog.vsharing.com/janezhangxy/A1060907.html
http://blog.csdn.net/Zevin/article/details/5626863
形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?相关推荐
- java形参、实参、值传递、引用传递
工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...
- java形参和实参的三种传递方式(值传递,地址传递,引用传递)
博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...
- java形参_java形参、实参、值传递、引用传递
工作中,发现大多数人对值传递,引用传递理解不深,下面写一遍文章详细聊聊. 一.形参 形参:用来接收调用方法时传递的参数,只有在被调用时才分配内存,一旦调用结束,就释放内存空间.因此仅在方法内有效. p ...
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
值传递:形参是实参的副本(复制.拷贝),形参值的改变不会影响实参的值,这种方式是很常见的. 指针传递:形参是指针类型,形参作指针运算后指向的就是实参,所以会影响实参的值.这种方式也是很常见的. 引用传 ...
- std::shared_ptr作为函数形参,通过值传递、引用传递的问题解答
最近应用开发项目中,使用智能指针比较多,同时也用到了一些开源的第三库,如Fast-DDS,这些软件项目中很多地方用到了智能指针,然而在偶然间看到一个关于智能指针的使用建议,提到"智能指针作为 ...
- Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
来自:沉默王二 在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很 ...
- java 定義json并賦值_java是值传递还是引用传递?
最近在项目中发现了类似如下的代码. import com.alibaba.fastjson.JSONObject; public class ValuePassParamTest { public s ...
- list修改元素的值_Python 到底是值传递还是引用传递
我们平时写的 Python 程序中充斥着大量的函数,包括系统自带函数和自定义函数,当我们调用函数时直接将参数传递进去然后坐等接收返回值即可,简直不要太好用.那么你知道函数的参数是怎么传递的么,是值传递 ...
- php值传递和java_Java的值传递和引用传递
形参与实参 我们先来重温一组语法: 形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后,a就 ...
最新文章
- 011_Raphael常用方法
- 《失控玩家》爆火背后:什么才是拥抱人工智能的正确姿势?
- python中的数列[a::b]操作
- Uncaught TypeError: Cannot redefine property: $router
- 修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)
- 机器学习爬大树之决策树(ID3,C4.5)
- data-ajax=“false“
- Intellij 中的git操作 转!
- ekho tts 下载_Ekho TTS简介(文本转语音引擎).pptx
- 《手把手教你》系列基础篇之2-python+ selenium自动化测试-打开和关闭浏览器(详细)
- java实现电子面单pdf生成_常用快递电子面单批量打印api接口对接demo-JAVA示例
- html+默认ie11,IE11浏览器怎么设置默认浏览器
- RTC唤醒低功耗(standby)模式
- 全国车辆限行限号数据接口服务评测
- win10 联想键盘快捷键关闭_Win10电脑不用鼠标怎么关机键盘与快捷键关机技巧
- 匹配,为什么要“共轭”
- c语言的%的转义吗,%20转义(C语言转义字符问题)
- 如何提升APP日活(DAU)?
- C语言进阶(牟海军)
- NAXX Demo2_WYQ_02
热门文章
- alv 刷新_钜献 | 60小时刷新你的雅思托福成绩!明早9点我们要搞事情了!
- mysql 查询相同字段值的个数_好文 | MySQL 索引B+树原理,以及建索引的几大原则...
- php中qq第三方登录演示,实现腾讯qq第三方登录
- (4) ebj学习:ejb发布web service
- 火山小视频尼尔森:2019新线消费市场人群洞察报告(附下载)
- 安装sqlserver时“试图执行未经授权的操作“的错误
- java图像处理之幂律变换
- tf.summary.scalar()和tf.summary.histogram
- elasticsearch api中的Multi Get API操作
- RTA广告能力的应用场景剖析