指针与指针的引用-

在看算法与数据结构的书时建立二叉树时出现BSTNode<T>*& node的代码。

指针与引用,百思不得其解,

现在做一些说明

指针的引用类似于双重指针

Tree *p=new Tree(1,2);

 

void display(Tree *p)

{

      p->delete();

      p=new Tree(2,3);

//若在此时给P赋值那么函数执行结束后,p的值依旧没有改变

}

这种试图在代码中修改p的指向必然失败

这就如同我们经常看到的代码change(int x ,int y)一样。

实参与形参的效果

记得很久之前看到一本书将传递类的指针与指针的引用不一样,现在想来才恍然大悟

也贴一些网上

一个网友在解释COM的接口查询时

在COM编程中,你到处都会碰到这样的用法--例如在查询对象接口的QueryInterface函数中:
interface ISomeInterface {
   HRESULT QueryInterface(IID &iid, void** ppvObj);
   ……
   };
   LPSOMEINTERFACE p=NULL;
   pOb->QueryInterface(IID_SOMEINTERFACE, &p);  

   此处,p是SOMEINTERFACE类型的指针,所以&p便是指针的指针,在QueryInterface返回的时候,如果调用成功,则变量p包含一个指向新的接口的指针。

 

另在百度中一种解释

template <class T>
class BTreeNode<T>{
//...
public:
BTreeNode<T>* left; // 指针数据成员,指向左节点
//...
}

我们就以此为基础来讲:
(1)对于返回指针的引用:
BTreeNode<T> *&Left(){return left;}
// 调用代码
BTreeNode<T> Node; // 定义一个节点, 假如此时Node.left指向的地址为0x00000000
BTreeNode<T> *pLeft = Node.left(); // 返回指针引用
pLeft = (BTreeNode<T>*)0x00040000; // 改变指针所指的内存地址, 由于是返回的指针引用,则此时Node.left的值已经被改变为0x00040000了

(1) 对于返回指针类型
BTreeNode<T> *Left(){return left;}
// 调用代码
BTreeNode<T> Node; // 定义一个节点, 假如此时Node.left指向的地址为0x00000000
BTreeNode<T> *pLeft = Node.left(); // 返回指针拷贝,此时pLeft指向的地址为0x00000000
pLeft = (BTreeNode<T>*)0x00040000; // 改变指针所指的内存地址, 由于是返回的只是指针的拷贝,则此时Node.left的值仍然为0x00000000

相信你已经明白两者之间的区别了!至于为什么要这么设计,依赖于二叉树数据结构的物理意义和施加于其上的操作需求,这个已经超出了程序语言的本身了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值