pointer &跟pointer这两种函数形参有区别吗

pointer &和pointer这两种函数形参有区别吗?
本帖最后由 u011873969 于 2014-01-06 20:48:42 编辑
感觉应该是没有区别的,因为对于指针来说,值传递和引用传递应该是等价的——但是我发现了一个问题,就是在如下的函数中,如果将NodePtr& head改成NodePtr head的话,那么

if (head == discard)
{
head = head->link;
removed = true;
// Note: after this is done, 'discard' is also changed
// into discard->link!
//delete discard;
}

中的
head = head->link;
这个语句就不起作用了!

bool erase(NodePtr& head, NodePtr discard)
{
bool removed = false;
if (head != NULL && discard != NULL)  
// It is the nonempty case that we are interested in; and
// in this case, discard must 'indeed' points to a node in the linked list!
{
if (head == discard)
{
head = head->link;
removed = true;
// Note: after this is done, 'discard' is also changed
// into discard->link!
//delete discard;
}
else
{
// The following deals with the case where discard is not the 'head'.

// First of all, we need to find out the node right before discard.
NodePtr before = head;
while (before != NULL)
{
if (before->link == discard)
{
removed = true;
break;
}
before = before->link;
}
// When the while loop ends, either before reaches the end of the linked list,
// or before == discard->link, which means that 'before' is right before 'discard' !
if (removed == true)
{
before->link = discard->link;
delete discard;
}
}
}

return removed;
}


此外还有更诡异的事情,就是将NodePtr&改成NodePtr后,余下的部分仍旧是正常运行的!这个是怎么回事呢?

PS:
NodePtr代表Node *,其中Node是节点结构体类型,而这个函数的功能是实现一个动态链表的删除操作,其中discard表示动态链表中指向某个节点的指针。

------解决方案--------------------
pointer &跟pointer这两种函数形参有区别吗因为你概念根本没搞清
T *和T &做参数才有类似的作用,但你举的例子是T *& 和 T *,你说能一样吗?换句话说你把NodePtr& head改成NodePtr *head才是实现类似的功能。
说白了用NodePtr &作参数就是为了能在函数中直接修改head这个指针本身所指向的地址,如果你传入NodePtr,那也只是传入一个指针副本,只不过这个副本所指向的地址和你的参数指向的地址相同。你能通过这个副本修改指针所指向的内容。但你那句
head = head->link;是直接将head这个参数的指向都变了
------解决方案--------------------
实参是指针,形参是指针,同样会产生拷贝,不用怀疑
实参是地址,形参是指针才能避免问题
------解决方案--------------------
引用:
对了,Node的结构如下:

struct Node
{
    int data;
    Node* link;
};


听前辈是不会有错滴,莫要钻牛角尖~
------解决方案--------------------
void get_mem(char* p)
{
     p = new char[10];
}

void get_mem(char* &p)
{
     p = new char[10];
}

测试下这两者的区别,印象会深刻点

------解决方案--------------------
传指针只能改变指针指向的地址中存储的值。传指针引用的话还能够改变指针本身指向的位置。
------解决方案--------------------
引用与值传递不等价。

引用可以“向上传递”,而值不可以。 
------解决方案--------------------
当然不一样。就是传引用和传值的区别啊。