谢谢楼上的兄弟 刚刚在网上搜索了下
-------------------------------------
这里不能将node *& head 改成 node*head 。因为:
有一条语句是:
head = newnode;
这条语句是改变参数head的值。你应该知道,函数参数只能单向传递,由调用者传递给函数,所谓要改变参数的值,事实上是通过指针或者引用才能改变。
node *& head的意思是:该函数将接收一个类型为“node型指针的实参”。“形参head”是一个 node 类型的指针的引用。我们的目的插入节点后修改“实参”的值,如果没有这个“&”符号。就仅能修改形参而不能修改实参。
如果改为 node ** head 的话,程序可以做下一修改,就可以正常运行了。
把 head = newnode 改为:* head = newnode;即可。
道理是一样的。
你可以从汇编层来考虑为什么函数只能单向传递:
例如
void fun1 ( int a );
void fun2 ( int * b );
// ........
int i;
fun1( i );
fun2( &i );
fun1将被这样编译:
push i
call fun1;
然后fun1访问i的时候,事实上访问的是栈里面被复制的i,而不是i本身。比如fun1中有访问i的语句,会被编译成这样:
mov [ SP + xxx ], ax ; SP是栈指针,xxx是偏移。
fun2将被这样编译:
lax ax, i ;
取i的地址
push ax
call fun2
然后fun2访问i的时候,是这样:
mov dx, [ SP + xxx ]; 取 指针 i 的值。
mov [ dx ], ax
; 将dx指向的地址复制为ax