首先来看看单链表中删除某结点定义的函数头:
//在带头节点的单链表中,删除值为x的结点
void Delete(Slist* &head,int x);
void Delete(Slist* head,int x);
1、相同点
Slist* head与Slist* &head都表示Slist类型的指针,都指向单链表的头结点。当我们在函数体中修改单链表中的内容(单链表的增删改)时,都会影响到原单链表的内容。
2、不同点
void Delete(Slist* &head,int x);
在C语言中,'&'表示取地址符。此处,形参中&head表示对实参的引用(相当于一个变量的另外一个名字,它们有相同的地址)。在函数体中对head指针的操作,都是直接对原指针的操作。无论是修改head指针指向的内容,还是修改head指针指向的地址,都是对实参指针的修改。
void Delete(Slist* head,int x);
调用此函数时,会将实参指针所指向的地址复制给形参指针head(形参与实参两个指针,指向同一个地址)。当在函数体中修改head指针所指向的地址时,不会影响原实参指针指向的地址(相当于对原指针的一个复制体进行修改,修改了复制体,本体不会改变)
因此,当我们需要对传入函数体的原实参指针的内容或指向的地址进行修改时,形参需要使用Slist* &head形式