在看算法与数据结构的书时建立二叉树时出现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
相信你已经明白两者之间的区别了!至于为什么要这么设计,依赖于二叉树数据结构的物理意义和施加于其上的操作需求,这个已经超出了程序语言的本身了。