精华内容
下载资源
问答
  • 大多处刚接触程序的小伙伴在学习C/C++的过程中都会遇到函数传值调用,传址调用传引用的概念,刚开始接触时肯定一时无法理解三者的区别和联系,可能有一部分小伙伴可能学了很长接触很长时间也一直对三者的概念有...

    大多处刚接触程序的小伙伴在学习C/C++的过程中都会遇到函数传值调用,传址调用和传引用的概念,刚开始接触时肯定一时无法理解三者的区别和联系,可能有一部分小伙伴可能学了很长接触很长时间也一直对三者的概念有一定的困扰,以及如何去应用,因为我也有类似的经历。

    本文将总结关于传值调用,传址调用和传引用三者的区别,如有不妥之处请私信,我将再次改正;

    一.传值调用:

    传值调用最早接触应该是在学C语言的阶段,接下来我们将通过一段简单的代码进行解析:

    #include <stdio.h>
    #include <stdlib.h>
    
    void Swap(int x,int y){
    	int tmp=x;
    	x=y;
    	y=tmp;
    }
    int main(){
    	int a = 10;
    	int b = 20;
    	printf("a=%d b=%d\n", a, b);
    
    	Swap(a, b);
    	printf("a=%d b=%d\n", a, b);
    
    	system("pause");
    	return 0;
    }
    

    输出结果为:
    在这里插入图片描述
    为什么交换之后输出的值和之前没有改变??并没有完成交换,因为在传参调用中,main调用swap时候,将实参a, b的值分别拷贝给形参x, y,然后a, b就不再和swap有关了,swap交换的是x, y的值,但是x, y的作用域只在swap中,他们确实完成了交换,但是swap结束之后,x, y的值也就随之销毁了,所以根本不会对行参有任何影响,当然就不会实现实参的交换;

    因为在传值调用的过程中实参和形参有不同的内存块,修改形参不会影响实参;即形参是实参的临时拷贝

    二.传址调用:

    传址调用的过程中把函数外部创建的临时变量的内存地址传递给函数参数,这种调用可以让函数和函数外边的变量建立起联系,函数内部可以直接操作函数外部;

    #include <stdio.h>
    #include <stdlib.h>
    
    void Swap(int *x, int *y){
    	int tmp = *x;
    	*x = *y;
    	*y = tmp;
    
    }
    
    int main(){
    	int a = 10;
    	int b = 20;
    	printf("a=%d b=%d\n", a, b);
    
    	Swap(&a, &b);
    	printf("a=%d b=%d\n", a, b);
    
    	system("pause");
    	return 0;
    }
    
    

    输出结果为:
    在这里插入图片描述
    函数参数完成了交换,原因是这样的,传址调用实际上还是实参到形参的拷贝,不过这次实参是要交换的两个数字的指针(即地址),而不是要交换的两个数本身,虽然形参在swap结束后被销毁,但是形参是根据要交换的两个数的地址完成交换的,所以对这两个数字产生影响,也就完成交换。

    三.传引用调用:

    传引用调用是我们在学习C++阶段接触到的知识点,在C语言中是没有的;

    #include<iostream>
    using namespace std;
    void swap(int &x, int &y){
    	int tmp = x;
    	x = y;
    	y = tmp;
    }
    int main(void){
    	int a = 10;
    	b = 20;
    	printf("a=%d, b=%d\n", a, b);
    
    	swap(a, b);
    	printf("a=%d, b=%d\n", a, b);
    	system("pause");
    	return 0;
    }
    

    输出结果为:
    在这里插入图片描述
    函数参数完成了交换,但是他的底层实现和以上两种都不相同,传值和传值调用的方式都是形参和实参在不同的内存块,然后进行调用,涉及形参和实参之间的拷贝;但是在传引用的调用过程中并没有涉及到实参和形参,而用的是同一块内存空间,而是直接将main里面的a, b传到swap里面,所以当然交换的就是a, b的值。

    传引用调用的原理:
    传引用调用过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的参数变量;
    引用传递方式是在函数定义时在形参前面加上引用运算符‘&’。在函数被调用时,参数传递的内容不是实参的值,而是实参的地址,即将实参的地址放到C++为形参分配的内存空间中,因此形参的任何操作都会改变相应实参的值。

    展开全文
  • 地址调用和传引用调用的区别

    千次阅读 2017-09-05 21:13:17
    地址调用和传引用调用的区别相同点: 引用和地址,原理上都是将参数变量的地址传递给被调函数。所以在函数内部修改参数的值时,均可返回修改之后的结果给调用者。 不同点: 引用一定会指向一个对象,而指针...

    传地址调用和传引用调用的区别

    相同点:

    1. 传引用和传地址,原理上都是将参数变量的地址传递给被调函数。所以在函数内部修改参数的值时,均可返回修改之后的结果给调用者。

    不同点:

    1. 引用一定会指向一个对象,而指针可能为空(NULL); 传引用时,系统对传过来的参数不会有任何额外开销,直接使用原始变量的内存空间。
    2. 传引用时,函数参数需要写做T&a; 调用函数时直接传递对象本身;在函数内赋值的时候,直接对a赋值即可。
    3. 传地址时,函数参数需要写作T*p;调用函数时需要传入对象地址; 赋值时需要对*p赋值。

    总结

    1. 从以上对比可以得知,传引用调用比传地址调用更为简单高效。之所以保留传地址调用,主要是为了兼容C语言的代码。在C++编程时,应尽量以传引用代替传地址。
    展开全文
  • 传引用调用与传值调用

    千次阅读 多人点赞 2017-10-26 12:20:01
    以下关于传值调用与传引用调用的叙述中,正确得是()。 ① 在传值调用方式下,可以实现形参和实参间双向传递数据的效果 ② 在传值调用方式下,实参可以是变量,也可以是常量和表达式 ③ 在引用调用方式下,...

    昨天做到一个题一脸懵逼。

    以下关于传值调用与传引用调用的叙述中,正确得是()。
    ① 在传值调用方式下,可以实现形参和实参间双向传递数据的效果
    ② 在传值调用方式下,实参可以是变量,也可以是常量和表达式
    ③ 在引用调用方式下,可以实现形参和实参间双向传递数据的效果
    ④ 在引用调用方式下,实参可以是变量,也可以是常量和表达式

    答案为 ②③

    所以,要搞懂这个首先要知道形参和实参

    实参与形参

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

    形参(parameter):
    全称为”形式参数” 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

    形参和实参的区别

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
    实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
    形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
    1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
    2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
    3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
    4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
    5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
    而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。
    所以在函数体内部可以改变实参的值。

    传值与引用

    1. 传值调用又分为数据传值调用和地址传值调用。 数据传值调用方式是将实参的数据值传递给形参。
      实参和形参在栈空间内的地址不相同,改变形参值不影响实参值; 地址传值调用方式是将实参的地址值传递给形参,
      实参和形参在栈空间内共用同一地址,改变形参值就可改变实参值。
    2. 引用调用是将实参变量值传递给形参, 而形参是实参变量的引用名。引用是给一个已有变量起的别名,
      对引用的操作就是对该已有变量的操作。 引用调用可以起到地址传值调用的作用, 即改变形参值就可改变实参值。引用调用比地址传值调用更为简单,
    展开全文
  • 相关的基本概念: ... 传引用调用传引用调用中,如果传递的参数是引用数据类型,参数视为实参。在调用过程中,将实参的地址传递给了形参,形参上的改变都发生在实参上。 基本数据类型:有八种 整数类...

    相关的基本概念:

    • 形参:定义方式时写的参数为形参
    • 实参:真正调用方法时,传入的参数为实参。
    • 在我们调用方法时,会把实参传递给形参,方法内部其实是在使用形参。
    • 传值调用:传值调用中传递的参数为基本数据类型,参数视为形参。
    • 传引用调用:传引用调用中,如果传递的参数是引用数据类型,参数视为实参。在调用过程中,将实参的地址传递给了形参,形参上的改变都发生在实参上。
    • 基本数据类型:有八种
    1. 整数类型:long、int 、short、byte
    2. 浮点类型:float、double
    3. 字符类型:char
    4. 布尔类型:boolean
    • 引用数据类型:类、接口类型、数组类型、枚举类型、注解类型、字符串类型

    eg:String类型就是引用类型

    传值调用:

    结果为:

    在通常的学习中经常遇到这个例子:

    public class Test {
       
        //进行的是传值调用,形参的变化不影响实参的数值
        public static void swap(int x,int y){
            int temp=x;
            x=y;
            y=temp;
        }
    
        public static void main(String[] args) {
            int a=10;
            int b=20;
            swap(a,b);
            System.out.println("a="+a+",b="+b);
    
        }
    }
    

    结果为:

             

    数字进行交换,利用值传递根本就没有改变内容;要利用到传引用调用

    当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值

    传引用调用

    public class Test {
    
        //传引用类型参数,形参的变化影响实参的变化
        public static void swap(int [] array){
            int temp=array[0];
            array[0]=array[1];
            array[1]=temp;
        }
    
        public static void main(String[] args) {
            int [] array={10,20};
            swap(array);
            System.out.println("a="+array[0]+",b="+array[1]);
        }
    }
    

    结果为:

    基本数据类型和引用数据类型作为参数的区别:

    • 基本数据类型的变量中直接存放数据值本身,所以改的时候改的是数据值本身;基本数据类型修改形参的话,是不影响实参的。
    • 但是引用数据类型不同的地方在于真正的数据并没有在栈区的变量中保存,而是在堆区里面保存着,虽然拷贝了一份,但是二者
    • 指向的是同一块堆区。引用数据类型修改形参是影响实参的。

    总结:

    1.Java的基本数据类型是传值调用,对象引用类型数传引用。

    2.当传值调用时,改变的是形参的值,并没有改变实参的值,但是实参的值是可以传给形参的,但是,形参的值不能传给实参。

    3.当引用调用时,如果参数是对象,无论对对象做了何种操作,都不会改变改变实参对象的应用(可参考String),但是,如果改变了对象的内容,就会改变实参对象的内容,因为形参变量和实参变量共享一块堆区。

     

    注:参考文章:https://blog.csdn.net/xyphf/article/details/78117027

    展开全文
  • 近期在项目中遇到一个场景,在多层级调用中需要传递上下文,调用过程中上线文对象可能为空,想通过一个公共方法处理上下文,当上下文为空时生成上下文对象,执行相关操作后将该上下文对象向后传递。大致逻辑如下: ...
  • C++——传引用调用

    千次阅读 2017-05-10 00:21:37
    传引用调用是什么?看下面效果就知道!普通函数调用#include using namespace std;void Test_Calculate(int data);int main() { int a = 5; Test_Calculate(a); cout ; return 0; }void Test_Calculate
  • 只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在方法内有效。 2.实参:传递给被调用方法的值,预先创建并赋予确定值。 3.传值调用:传值调用中传递的参数为基本数据类型
  • 除了四类八种基本类型外,所有的类型都称为引用类型(如:数组,类,接口,字符串) 值传递 基本数据类型赋值都属于值传递; 值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形...
  • c# 传值调用和传引用调用

    千次阅读 2013-05-07 20:58:27
    传值调用和传引用调用是几乎所有主流语言都会涉及到的问题,下面我谈谈我对C#中传值调用和传引用调用的理解。 1. 一般对C#中传值调用和传引用调用的理解 如果传递的参数是基元类型(int,float等)或结构体...
  • 传引用调用形参

    千次阅读 2016-09-25 15:41:54
    一是传值调用机制,二是用于替换形参的传引用调用机制,下面主要针对应用调用机制进行简单的阐述。  1. 区别:  传值调用机制是将实参中的值传递给函数的形参,并不会将实参这个变量传入; 传引用调用机制是用...
  • 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸: 1. 考题一:程序代码如下: void Exchg1(int x, int y)  { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d/n”,x,y) } void ...
  • C++里面的传值传址传引用调用问题

    千次阅读 2012-02-15 22:21:42
    C++里面的传值传址传引用调用问题 // C_TEST.cpp : Defines the entry point for the console application. // // #include "stdafx.h" #include "iostream" using namespace std;//我是在VS2008里面作...
  • 函数的传值调用和传址调用在C和C++中都是合法的语法,但是引用调用就只是在C++中合法的。1.传值调用:程序:#includevoid swap(int x, int y){ int tmp = x; x = y; y = tmp;}int main(void){ int a = 1, b = 2; ...
  • 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸:1. 考题一:程序代码如下:void Exchg1(int x, int y) {int tmp;tmp=x;x=y;y=tmp;printf(“x=%d,y=%d/n”,x,y)}void main(){int a=4,b=6;...
  • 传值调用和引用调用的理解

    千次阅读 2019-08-13 22:57:38
    引用调用 实参---->形参(实参地址给形参,形参获得实参的地址),改变形参会反映在存储单元中,实参会被改变。 只有实参传值或者地址给形参! 没有形参穿值或者地址给实参的说法! 形参没有确定的值,只能是...
  • c语言传值调用与引用调用

    千次阅读 2018-04-09 15:01:16
    转载自 https://blog.csdn.net/ly0303521/article/details/44310125...2、引用调用 把实参(int a)的地址(&amp;a)赋给形参(指针变量,比如*b,这时b=&amp;a,即b指向变量a),如果*b(也即a对应的内存空间)发生...
  • 形参&实参,传值调用&引用调用

    千次阅读 多人点赞 2019-03-20 09:11:00
    引用调用传值调用传值调用的定义传值调用的代码实例引用调用引用调用的定义引用调用的代码实例 引言 相信很多C语言初学者都知道形参实参的概念,但在函数调用中,仍然还有很多人会混淆,本文将借助示例代码详细解释...
  • JAVA类之间方法的调用

    万次阅读 多人点赞 2018-11-02 23:39:15
    JAVA类方法的调用一、静态方法调用其他方法:1. 静态方法调用非静态方法2.静态方法调用静态方法二、非静态方法调用其他方法1.非静态方法在同一类内调用其他方法2.非静态方法在不同类之间调用其他方法 注:调用方法...
  • 我们通过函数调用的方式进行运算,有两种方式得到运算结果 ①设置函数的返回值,return ②将传入值的地址(即传入值自身)交给函数,函数对其进行运算相当于直接对传入值进行运算。 2.输入参数的定义 我们在...
  • 有些程序员,认为java对对象采用的是引用调用,实际上这种理解是不对的!!!       举例代码: 先写一个People类 package diaoYong; class People { private String name; public People(String str...
  • Java--按值调用和按引用调用

    千次阅读 2018-07-16 20:10:45
     按引用调用:表示方法接收的时调用者提供的变量地址  在Java中总是采用按值调用,方法得到的参数值是一个拷贝。 二、实例演示  (1) 在 Java 中,八种基本数据类型和String类型,在方法中不能直接对类中使用该...
  • 传值调用地址调用传引用

    千次阅读 2017-02-03 11:08:14
    C/C++中参数传递有两种方式,传值或地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要地址调用方式,例如: void swap_by_value(int a, int b) { int temp; temp = a; a = b; b = temp; } void ...
  • WCF服务创建,并调用(调用过程,不需添加服务引用)。 打破传统的添加服务引用的方式,直接通过地址调用。请求和返回结果以JSON的形式来添加
  • 多态 父类的引用可以调用子类中重写的父类的方法,但不能调用子类中独有的方法,即不能调用父类中不存在,子类中存在的方法。
  • C语言引用方式调用函数

    千次阅读 2019-08-14 12:54:09
    引用方式调用函数 通过引用传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。 /* 函数定义...
  • C++传值调用与引用调用的区别

    千次阅读 2014-03-15 23:43:48
    简单来说,传值调用就是指当一个... 引用调用过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被掉函数对形参的任何操作都被处理成间接寻址
  • java中参数传值和传引用例子详解

    千次阅读 2018-10-11 16:07:56
    1.当参数为基本数据类型时,在方法体中对形参的修改不会影响到实参的数值 set类: package hello; public class set { public set(int a){ a--; System.out.println("a的函数值为:"+a); } //构造...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,932,057
精华内容 772,822
关键字:

传引用调用