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

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

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

  1. C语言形参和实参的区别

    形参(形式参数) 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参. 实参(实际参数) 函数被调用时给出的参数包含了实实在在的 ...

  2. java中形参和实参的区别

    引用博客 引用博客 形参和实参的区别 形参 就是形式参数,用于定义方法的时候使用的参数,用来接收调用者传递的参数.形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的 ...

  3. java中实参和形参_java中形参和实参的区别

    实参和形参是程序设计语言中的通用概念,并不是只有C,C++有而JAVA没有.关于他们两者的区别你知道吗?下面是学习啦小编为大家准备的java中形参和实参的区别,希望大家喜欢! java中形参和实参的区 ...

  4. C语言形参和实参的区别(非常详细)

    如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品:从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值. 这一节我们先来讲解C语言函数的参数,下一节再讲解C语言函数的返回值. ...

  5. Java方法的形参和实参的区别

    Java方法的形参和实参的区别,可以通过以下示例理解,如下所示. 示例代码: package com.example.jdbctemplateproject.core;public class Tes ...

  6. c语言实参和形参占用存储单元_必须知道的C语言知识细节:函数形参和实参的区别...

    当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch C语言中函数形参和实参是十分重要的概念,初学者很容易混淆. 形参:顾名思义,形式参数,仅仅是声明了参数的类型和参数 ...

  7. java 形参和实参_Java——形参和实参的区别

    形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用. 实参出现在主调函数中,进入被调函数后,实参变量也不能使用. 形参和实参的功能是作数据传送.发生函数调用时,主调函数把实参的值传送 ...

  8. Java中 形参 和 实参 的区别:

    形参(parameter): 全称为"形式参数" ,由于它不是实际存在变量,所以又称虚拟变量. 实参(argument): 全称为"实际参数",是在调用时传递给 ...

  9. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

最新文章

  1. Nginx 在centos linux 安装、部署完整步骤并测试通过
  2. 计算机毕业论文过程管理手册,毕业论文过程管理手册(修改)-陈亚琴.doc
  3. 删除时存在依赖_从一次线上故障来看redis删除机制
  4. 安装rpm的mysql_linux下安装rpm格式的mysql
  5. vue 按需加载,换存,导航守卫
  6. Python爬虫:Xpath语法笔记
  7. 关于“让我们基于Node.js创建一个Web应用:记事本(三)”
  8. 港湾命令行 配管理IP
  9. winform程序最大化时,页面显示不全的问题
  10. matlab imresize对图像进行缩小放大
  11. 苹果叶片病害识别中的深度学习研究
  12. 两篇介绍IIS的文章
  13. android 扫描照片功能,巧把安卓手机打造成扫描仪:拍照识别文档、手写笔记转PDF(图)...
  14. 拓端tecdat|R语言广义线性模型(GLMs)算法和零膨胀模型分析
  15. 数据库高级——多表查询
  16. c语言编程数字后有ul,十六进制数后跟L/U/UL解析
  17. web service 优缺点
  18. RocketMQ——顺序消息
  19. QColor类的使用
  20. 树莓派:64位 RPI OS(Bullseye) 更换国内源

热门文章

  1. python3无法安装tkinter_python tkinter安装教程【python tkinter 无法安装】
  2. MySQL常见的数据类型
  3. spark原理解析和spark core
  4. 父亲节:再见,总有一天
  5. 看着舒服的学习网站易百教程
  6. 概率论 x 数据分析:从贝叶斯定理到概率分布
  7. Naive ui主题色修改
  8. 来自大厂 10+ 前端面试题附答案(整理版)
  9. FastDFS 集群搭建
  10. 2021-02-13-idea使用svn检出代码和更新上传代码