| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 628 人关注过本帖
标题:关于用引用传递数据的疑惑
取消只看楼主 加入收藏
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
结帖率:87.93%
收藏
已结贴  问题点数:20 回复次数:1 
关于用引用传递数据的疑惑
在看<<易学C++>
在链表中一章中有一个函数是这样使用的
void insert(node * &head,char keyWord,char newdata)
作者在试试看中提出
void insert(node * head,char keyWord,char newdata)
与上面的有何区别
我写了下程序 好象感觉上没什么区别,和上面程序一样能跑出正确的结果
想问下这两种参数传递上有何区别
搜索更多相关主题的帖子: 数据 
2009-11-13 15:01
happynight
Rank: 8Rank: 8
等 级:贵宾
威 望:15
帖 子:807
专家分:760
注 册:2008-4-26
收藏
得分:0 
谢谢楼上的兄弟 刚刚在网上搜索了下
-------------------------------------
这里不能将node *& head 改成 node*head 。因为:

有一条语句是:
    head = newnode;

这条语句是改变参数head的值。你应该知道,函数参数只能单向传递,由调用者传递给函数,所谓要改变参数的值,事实上是通过指针或者引用才能改变。

node *& head的意思是:该函数将接收一个类型为“node型指针的实参”。“形参head”是一个 node 类型的指针的引用。我们的目的插入节点后修改“实参”的值,如果没有这个“&”符号。就仅能修改形参而不能修改实参。

如果改为 node ** head 的话,程序可以做下一修改,就可以正常运行了。
  把 head = newnode 改为:* head = newnode;即可。

道理是一样的。


你可以从汇编层来考虑为什么函数只能单向传递:
例如

      void fun1 ( int a );
      void fun2 ( int * b );

     // ........
      int i;
      fun1( i );
      fun2( &i );

fun1将被这样编译:
      push i
      call fun1;
然后fun1访问i的时候,事实上访问的是栈里面被复制的i,而不是i本身。比如fun1中有访问i的语句,会被编译成这样:
      mov [ SP + xxx ], ax ; SP是栈指针,xxx是偏移。

fun2将被这样编译:
      lax ax, i ;      取i的地址
      push ax
      call fun2
然后fun2访问i的时候,是这样:
      mov dx, [ SP + xxx ]; 取 指针 i 的值。
      mov [ dx ], ax      ; 将dx指向的地址复制为ax
2009-11-13 15:19
快速回复:关于用引用传递数据的疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023868 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved