根据*和&运算符的规则,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在函数里就是个值传递!虽然明白了,但头脑有点混乱了,再慢慢理解慢慢消化一下。。。