博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

windlike的web开发博客

人生得意须尽欢,莫使金樽空对月
  windlike.cublog.cn

关于作者
一个人的成功,只有15%归结于他的专业知识,还有85%归于他的表达思想,领导他人及唤起他人热情的能力.- 戴尔·卡耐基
|| << >> ||
我的分类


传值和传引用、传地址的区别是什么?
  传值,   
  是把实参的值赋值给行参   
  那么对行参的修改,不会影响实参的值   
   
  传地址   
  是传值的一种特殊方式,只是他传递的是地址,不是普通的如int   
  那么传地址以后,实参和行参都指向同一个对象   
   
  传引用   
  真正的以地址的方式传递参数   
  传递以后,行参和实参都是同一个对象,只是他们名字不同而已   
  对行参的修改将影响实参的值

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

觉得从函数调用的角度理解比较好   
   
  传值:   
  函数参数压栈的是参数的副本。   
  任何的修改是在副本上作用,没有作用在原来的变量上。   
   
  传指针:   
  压栈的是指针变量的副本。   
  当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。   
   
  传引用:   
  压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。(作用和传指针一样,只是引用少了解指针的草纸)  

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


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

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

 原文地址 http://topic.csdn.net/t/20051207/06/4442668.html
发表于: 2007-06-05,修改于: 2007-06-05 19:46,已浏览1138次,有评论7条 推荐 投诉


网友评论
网友: xiaofeng1982 时间:2007-06-05 19:48:44 IP地址:211.96.69.★
传值: 形参怎么变,实参也不会跟着形参变.     
传引用: 实参会随着形参而改变,相当于用一个变量名.     
传地址: 实参会随着形参而改变,由于他们用一个地址.  
这些只是本人的理解.

网友: windlike 时间:2007-06-05 20:06:26 IP地址:211.96.69.★
在我以往的开发经验中,还没用到过“传引用”。什么时候”传地址“,什么时候"传引用"呢?

网友: windlike 时间:2007-06-06 10:52:14 IP地址:211.96.69.★
在PHP手册中,传值和传地址的解释:
位置: PHP 手册 -> 章7. 变量
PHP 3 中,变量总是传值赋值。那也就是说,当你将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。有关这种类型的赋值操作,请参阅表达式一章。 
PHP 4 提供了另外一种方式给变量赋值:传地址赋值。这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。这同样意味着其中没有执行复制操作;因而,这种赋值操作更加快速。尽管如此,任何提速的操作只有在紧密循环或者大数组或者对象才可能被注意到。 
使用传地址赋值,简单地追加一个(&)符号到将要赋值的变量前(源变量)。
需要注意的是只有命名变量才可以传地址赋值,这一点非常重要。

网友: raincatss 时间:2007-06-12 11:59:56 IP地址:221.232.169.★
好文章!

网友: windlike 时间:2007-06-22 17:12:28 IP地址:202.134.70.★
// 例子: 通过引用传递参数
function doubleValue(&$var){
  $var = $var * 2;
}
$variable =5 ;
doubleValue($variable);
echo "\$variable is : $variable";
// 该例输出: $variable is : 10

// 例子: 通过引用赋值
$x = 10;
$y = &$x;
$y++;
echo $x;
echo $y;
// 该例输出: 11 11 
// 因为$y是对$x的引用,因此对$y的任何改变都会影响$x。实际上,它们是同一个变量。因此,若将$y加1,也就将$x加1,因而两者都等于11。


网友: windlike 时间:2007-06-22 17:18:58 IP地址:202.134.70.★
// 例子: 从函数返回的引用
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
echo $a;
// 此例输出: 6

网友: windlike 时间:2007-06-22 17:23:39 IP地址:202.134.70.★
// 例子: 取消引用
// 当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
$a = 1;
$b =& $a;
unset ($a);
// 不会 unset $b,只是 $a。反之 unset($b) 也实用

 发表评论