精华内容
下载资源
问答
  • 传地址调用和传引用调用的区别

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

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

    相同点:

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

    不同点:

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

    总结

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

    万次阅读 多人点赞 2016-11-27 12:15:28
    竟然自己发现对传值,传指针,传引用这个每天都在用的传递方式的区别还不是很清楚。以为自己懂了,其实还理解得还不够深入,基础还需要花时间琢磨。今天参考了很多篇博客书籍做些总结。其实,不用分为三类,只有两...

    C++写了很多年,有一天,写着写着代码。竟然自己发现对传值,传指针,传引用这个每天都在用的传递方式的区别还不是很清楚。以为自己懂了,其实还理解得还不够深入,基础还需要花时间琢磨。今天参考了很多篇博客和书籍做些总结。

    其实,不用分为三类,只有两类即可。传值和传引用。为什么会出现传地址(即传指针)呢?本质就是大家一致对传值和传地址概念的理解错误导致,也是对指针的概念的理解错误导致。

    概念

    **指针:**指针就是一个变量,如果非要说是一个特殊的变量也不为过,因为指针的初始化和解引用等不同的操作方式而已。就内存的分布来说,指针和一个变量在内存中存放是没有任何区别的,无非指针存放的是变量的地址。

    **传值:**传值无非就是实参拷贝传递给形参,单向传递(实参->形参),赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。

    **传地址:**为什么说传地址也是一种传值呢?因为传地址是把实参地址的拷贝传递给形参。还是一句话,传地址就是把实参的地址复制给形参。复制完毕后实参的地址和形参的地址没有任何联系,对形参地址的修改不会影响到实参, 但是对形参地址所指向对象的修改却直接反应在实参中,因为形参指向的对象就是实参的对象。

    **传引用:**传引用本质没有任何实参的拷贝,一句话,就是让另外一个变量也执行该实参。就是两个变量指向同一个对象。这是对形参的修改,必然反映到实参上。

    例:

    #include<iostream>
    using namespace std;
    
    void Value(int n)
    {
    	cout << "Value(int n)"<< endl;
    	cout << "{" << endl;
    	cout << "	&n=" << &n << endl; 
    	cout << "}" << endl;
    	n++;
    }
    
    void Reference(int &n)
    {
    	cout << "Reference(int &n)" << endl;
    	cout << "{" << endl;
    	cout << "	n=" << n << "  &n=" << &n << endl;
    	cout << "}" << endl;
    	n++;
    }
    
    void Pointer(int *n)
    {
    
    	cout << "Pointer(int *n)" << endl;
    	cout << "{" << endl;
    	cout << "	n=" << n << "  &n=" << &n << endl;
    	(*n)++;
    
    	int b = 20;
    	cout << "	b=" << b << "  n = &b" << endl;
    
    	n = &b;
    	cout << "	n=" << n << "  &n=" << &n << endl;
    	(*n)++;
    	cout << "}" << endl;
    }
    
    int	main()
    {
    	int n = 10;
    	cout << "n = " << 10 << "  &n=" << &n << endl<< endl;
    
    
    	Value(n);
    	cout << "after Value() n=" << n << endl << endl;
    
    	Reference(n);
    	cout << "after Reference() n=" << n << endl << endl;
    
    	Pointer(&n);
    	cout << "after Pointer() n=" << n << endl << endl ;
    
    	system("pause");
    	return true;
    }
    

    运行结果:
    这里写图片描述

    分析:
    值传递时函数操作的并不是实参本身,形参和实参是相互独立的,所以对形参进行操作并不会改变实参的值。

    引用传递操作地址是实参地址 ,形参相当于实参的一个别名,对它的操作就是对实参的操作。

    指针传递时,可以通过指针操作实参,同样可以改变实参的值。

    总结
    传引用和传指针看上去效果一样的,但本质上有区别:

    指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
    在值传递过程中,被调函数的形式参数作为被调函数的局部变量,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,前面说过,值传递是单向传递(实参->形参),赋值完毕后实参就和形参没有任何联系。那指针传递是怎么通过这个局部变量访问实参的呢,当然是通过局部变量中存储的地址。
    既然形参和实参是相互独立的,在没有任何修饰形参时,形参是可以被修改的,形参指针可以指向任何地方,而且修改后就无法再访问到实参。例如Pointer函数中n = &b后,(*n)++不会再修改实参的值,这也是传递指针时通常会用const进行修饰的原因。
    例如
    这里写图片描述

    而在引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

    引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。

    为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:

    程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。

    最后,总结一下指针和引用的相同点和不同点:

    ★相同点:

    ●都是地址的概念;

    指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

    ★不同点:

    ●指针是一个实体,而引用仅是个别名;

    ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

    ●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)

    ●引用不能为空,指针可以为空;

    ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

    ●指针和引用的自增(++)运算意义不一样;

    ●引用是类型安全的,而指针不是 (引用比指针多了类型检查)

    以上内容是网上和书籍上找到的资料结合自己的理解写的,有不对的地方,欢迎指教,一同学习。

    展开全文
  • 那么传地址以后,实参行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 ---------...

    传值, 
       是把实参的值赋值给行参 
       那么对行参的修改,不会影响实参的值 

       传地址 
       是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 
       那么传地址以后,实参和行参都指向同一个对象 

       传引用 
       真正的以地址的方式传递参数 
       传递以后,行参和实参都是同一个对象,只是他们名字不同而已 
       对行参的修改将影响实参的值

    -----------------------------------------------------------------------------------

    觉得从函数调用的角度理解比较好 

       传值: 
       函数参数压栈的是参数的副本。 
       任何的修改是在副本上作用,没有作用在原来的变量上。 

       传指针: 
       压栈的是指针变量的副本。 
       当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。 

       传引用: 
       压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。(作用和传指针一样,只是引用少了解指针的草纸)  

    -----------------------------------------------------------------------------------
    函数参数传递机制的基本理论 
         函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。 
         值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 
         引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的 
       实参变量。 


    -----------------------------------------------------------------------------------

    仅讨论一下值传递和引用: 
       所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。 
       所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。

     

    转自百度文库

    展开全文
  • PHP传值和传引用传地址区别

    千次阅读 2013-03-17 20:46:07
    PHP传值和传引用传地址区别 PHP传值和传引用传地址区别是什么? 传值: 是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值 传地址: 是传值的一种特殊方式,只是他传递的是地址,...

    PHP传值和传引用、传地址的区别

    PHP传值和传引用、传地址的区别是什么?

    传值:

    是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值


    传地址:

    是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
    那么传地址以后,实参和形参都指向同一个对象

    传引用:

    真正的以地址的方式传递参数
    传递以后,形参和实参都是同一个对象,只是他们名字不同而已
    对形参的修改将影响实参的值


     

    从函数调用的角度理解比较好

    传值:
    函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。


    传指针:
    压栈的是指针变量的副本。
    当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。

    传引用:
    压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。(作用和传指针一样,只是引用少了解指针的草纸)  

     


     

    函数参数传递机制的基本理论


    函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题;函数的目的终归是对目标数据的处理(常见的有,设置变量的值等其它属性)。

    基本的参数传递机制有两种:值传递和引用传递。

    以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数:
         

    值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(ps:即值传递过程中,函数是对作为局部变量的形参进行的操作!)
         

    引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 ps:表面对形参的操作实际是对实参变量的操作。

     如上所述,值传递和引用传递对实参变量的处理过程是不一样的,函数对值的操作和对引用的操作的机制是不一样;形参总是被作为局部变量来处理的,函数会根据在其内存空间中存储的是实参的值的副本还是实参的地址的副本分别处理,至于函数是如何区分值和地址的,我不得而知,貌似也不必知道。


     


    仅讨论一下值传递和引用:

    所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。
    所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。

    引用的作用 
    如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。

    取消引用 
    当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

    <?php 
    $a = 1; 
    $b =& $a; 
    unset ($a); 
    ?>

    不会 unset $b,只是 $a。

    global 引用 
    当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

    <?php 
    $var =& $GLOBALS["var"]; 
    ?>

    这意味着,例如,unset $var 不会 unset 全局变量。

    $this 
    在一个对象的方法中,$this 永远是调用它的对象的引用。

    补充:
    php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

     

    传值的话,如果是非对象,会传一个值的拷贝,对这个变量做任何改动都不影响原值。
    传引用或者传对象,是传真实的内存地址,对这个变量做的改动会影响原值。
    
    function func1($a) {
      $a = $a + 1;
    }
    function func2(&$a) {
      $a = $a + 1;
    }
    $sample = 1;
    func1($sample); 
    echo $sample; // 输出 1
    
    $sample = 1;
    func2($sample); 
    echo $sample; // 输出 2

     

     

    展开全文
  • 一、指针和传指针引用区别 相同点: 都是地址的概念。指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。 不同点: 1. 指针是一个实体,而引用仅是个别名 2. 引用只能在定义时被初始...
  • 函数传值 传地址 传引用区别

    千次阅读 2012-06-28 23:02:42
    传值,   是把实参的值赋值给行参  ... 那么传地址以后,实参行参都指向同一个对象     传引用   真正的以地址的方式传递参数   传递以后,行参实参都是同一个对象,只是他们名字不同而已
  • 一、引用引用的定义:引用是给另外一个变量其别名,所以引用不会...通过这样的定义,pt2pt1表示同一对象,需要特别注意的是,引用并不产生对象的副本,仅仅是对象的同义词,因此当执行下面的语句之后 pt1.of...
  • PHP传值和传引用区别

    千次阅读 2018-08-08 14:39:51
    传值和传引用传地址区别: 1、传值,是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 2、传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参行参都指向同一...
  • Java中传值和传引用区别

    千次阅读 2016-02-21 14:26:34
     在这里,要想搞清楚二者的区别,那么首先明白两个概念,“传值”、“传引用”。  1、传值:传值就是指将一个值传递到方法的内部。例如int a = 5,那么也就是给int型变量a赋值,值为5.如果一个方法,将这个变量传进...
  • 1、传值就像图中一样传的是原来实参的一份拷贝,对形参进行操纵不会改变实参的值,函数返回后,...3、传引用什么也没创建,只是给实参取了个别名,就像同学之间取外号一样,张三是这个同学,铁蛋也是这个同学,两...
  • 很多编程老手对传值,传地址传引用区别搞的也不会很清楚,今天我就花一点时间再次介绍一下这些概念的本质。  其实,不用分为三类,只有两类即可。传值和传引用。为什么会出现传地址(即传指针)呢?本质就是...
  • PHP传值和传引用传地址区别: 传值: 是把实参的值赋值给行参,相当于复制一块同样的空间 那么对行参的修改,不会影响实参的值  function aa($i){  $i++;  }  //按值方式  $m=2;  
  • 函数传值:传值实际上是在子函数的栈里面重新开辟一个空间存储进来的实参参数值,所以在子函数内对子函数的形参参数进行操作(赋值之类的)只是改变了子函数那个栈里面的内存值,原函数的值并不会被改变,因为原...
  • Java 传值和传引用区别

    万次阅读 2018-09-18 21:16:52
    首先对传值和传引用要有个基本的概念 * 传值:传递的是值的副本。方法中对副本的修改,不会影响到调用方。 * 传引用:传递的是引用的副本,共用一个内存,会影响到调用方。此时,形参实参指向同一个内存地址。对...
  • 对象在方法中传递时,仅仅的是地址的副本-这句话需要深刻理解 public class MainActivity extends AppCompatActivity { Book book; @Override protected void onCreate(Bundle savedInstanceState) { ...
  • PHP传引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。 传值:copy是一样的。【打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子一模一样的房子,你在你的...
  • 1.js与php传值赋值传递引用地址】赋值 我们知道,js中,原始类型的赋值,是将值直接复制给变量;引用类型的赋值,是将内存地址复制给变量 //学习一个好方法:就是类比 这里总结哪些是直接...
  • 传值和传引用区别

    千次阅读 热门讨论 2013-08-28 20:20:55
    通过分析某函数中调用“关闭连接”函数“关闭cmd命令”函数后,是否可以关闭连接cmd命令来分析传值和传引用区别: 请注意看代码中被框注的部分 一,代码分析 代码1:     代码2:     代码3:    分析:...
  • //传值赋值和引用赋值区别 /*传值赋值: a.变量表:放变量名 指向它们各自的位置(盒子) b.位置(盒子):存放值类型*/ $a1 = 234; $a2 = 34556; $a1 = $a2; var_dump($a1,$a2); $a2 = 'nongjiale.fun'; var_...
  • 传值调用与传地址调用(传引用

    千次阅读 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 ...
  •  上面通过一个例子说明了传值调用和传地址调用的区别。另外还有几点需要说明的是:  1、java语言中并没有像c++那样的显式指针,但java中的引用就相当于c++的指针。  2、new出来的对象是存放在堆内存(heap...
  • C++中传值传指针传引用区别

    千次阅读 多人点赞 2019-02-28 17:59:28
    当调用函数时,传递的参数有传值、传指针、传引用这三种形式。 直接传值是直接开辟了一个跟主函数实参一样的空间(地址不一样),里面存放了了跟实参一样大小的值,就相当于数值大小相同但是位置不同。你在这个调用...
  • 传值和传引用、传指针的区别

    万次阅读 2014-04-18 09:50:51
    那么传地址以后,实参行参都 指向同一个对象   传引用, 真正的以地址的方式传递参数, 传递以后,行参实参 都是同一个对象 ,只是他们名字不同而已,   对行参的修改将影响实参的值。 传递引用与传...
  • C++语言的传递方式:传值,传地址传引用。没记错的话C++98之后传引用才可以用。 第一种方式: 传值:就是拷贝一份数据给,数据量小无所谓,数据量大,这个不推荐,效率很慢的。 示例:第一个fun函数。典型的...
  • php中传值与传引用区别?

    千次阅读 2017-04-23 19:19:56
    PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。 大牛的解释: 传值:copy是一样的。【打个比方,我有一橦房子,我给你建筑材料,你建了一个根我的房子...
  • 原文地址:http://blog.csdn.net/miniminiyu/article/details/52061401  名词解析: 1.形参:用来接收调用该方法时传递的参数。只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间。因此仅仅在...
  • java的传值和传引用区别

    千次阅读 2012-02-26 14:37:12
    java是传值还是传引用,这个估计很多人至今都很糊涂,这里有篇文章写的还是可以的,大家可以看看。。  这个写的还是比较清楚,只是不够深入。 1. 简单类型是按值传递的  Java 方法的参数是简单类型的时候,是...
  • C++中传值、传址与传引用区别

    千次阅读 2016-07-19 10:07:55
    1、参数传递的概念  所谓参数传递就是用函数调用...(3)传引用;  总体上参数传递可以分为两类,由形参的类别决定:值调用与引用调用。除了定义为引用类型的形参外,其他类型的形参都是对应着值调用。指针传递也是

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,093
精华内容 33,237
关键字:

传地址和传引用的区别