C++中,使用指针p和使用*&p有什么区别?

根据*和&运算符的规则,p和*&p应该都是代表同一个内存存储单元的地址,感觉好像没什么区别。但我在做往链表插入结点的习题中,当分别使用这两种表达方式来代表表头指针时,却导致结果不同,函数形参使用*&p时正常,而使用*p却不正常:
void insert(node *&head, char keyWord, char newData)
{
node *newNode=new node;
newNode->data=newData;
node *pGuard=search(head, keyWord);
if(head==NULL||pGuard==NULL) {
//如果形参不是*&p而是*p,这里就无法把新结点插入表头
newNode->next=head;
head=newNode;
}
else
{
newNode->next=pGuard->next;
pGuard->next=newNode;
}
}
如果把形参*&head换成*head,那么当head为空时,就不能正确把新结点插入到表头。求大虾解释一下,谢谢!!
估计是*&head被翻译成引用了,如果是*head,则传进来的是一个值。。。
这样的说法似乎可以解释问题之所在,*&head形参在函数中的声明或许应该被看作是对指针head的引用,而不是函数外部所翻译的表达式。按以往的思维方式,总是觉得只要传入指针,就相当于引用了,因为指针间接改变了引用值后,也就改变了原变量的值。。。而这次却有个微妙的区别,head并没有改变所引用的地址中的值,而只是改变了自身的地址!而且,这个作为参数的指针head在函数里就是个值传递!虽然明白了,但头脑有点混乱了,再慢慢理解慢慢消化一下。。。

首先指出你理解的一个错误,“p和*&p应该都是代表同一个内存存储单元的地址”这句话没错,但是它是有条件的,是在对变量的引用中才正确。

在本题中形参是对变量的声明,并不是对变量的引用。所以你的形参为指针的引用。即 node *&head 为实参的引用。

要想将其换为*head,必须return head;之后调用时获得新的head。

看来你是把指针的定义没搞清楚。指针同其他变量一样也是一个变量。给个例子,自己慢慢比较比较!
void swap(int & m,int & n)//若为swap(int m,int n)将不会交换。
{int t=m;m=n;n=t;}
int m,n;
swap(m,n);
将m,n换为指针即变成了
void swap(int* & m,int* &n)//若为swap(int * m,int * n)也将不会交换。
{...}
int * m,* n;
swap(m,n);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-06
估计是*&head被翻译成引用了,如果是*head,则传进来的是一个值,在外部的那个变量的值没被更改,所以没出正确结果.如果是引用的话,外部的那个变量的值就会被改变.你试试看.
相似回答