(2)引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改.因而函数返回后作出的修改会依旧存在,引用传递可以节省复制所需要的时间和空间。
(3)对于二重指针的使用情况:对于链表和树或char*字符串时,这些本身就是指针类型,当需要通过形参带回变化后的结果时,又要使用指针作参数,所以使用二重指针作为形参。如果函数传参采用一级指针时,解引用时只能改变该指针指向的头或根结点,而不能影响整个链表或树这个结构。
定义链表结构时,LinkList(也就是LNode *)H代表的是整个链表,函数传址调用时,实参传递的是地址值。当采用二级指针形参LinkList *L(也就是LNode **)时,要传递链表的起始地址&H给形参L,而采用一级指针形参LNode *L时,传递的是头结点的地址&(*H)(也就是头指针H)。
针对以上情况也可以使用指针的引用来代替二重指针,以下是分别用二重指针和指针引用作为形参的示例程序:
#include<iostream>
using namespace std;
void test(int **p) //以指针类型变量的地址作为形参
{
int a=1;
*p=&a; //*p作为一个指针变量存放的是变量a的地址
cout<<*p<<" "<<**p<<endl;
}
int main(void)
{
int *p=NULL; //定义指针类型的变量p
test(&p); //通过指针地址作为形参传递改变了指针p的内容
if(p==NULL)
cout<<"指针p为NULL"<<endl;
system("pause");
return 0;
}
下面是利用形参为指针的引用的函数:
#include<iostream>
using namespace std;
void test(int *&p)
{
int a=1;
p=&a;
cout<<p<<" "<<*p<<endl;
}
int main(void)
{
int *p=NULL;
test(p);
if(p==NULL)
cout<<"指针p为NULL"<<endl;
else
cout<<p<<" "<<*p<<endl;
system("pause");
return 0;
}
可以看出利用指针的引用相较二重指针达到了相同的功能,但比使用二重指针要简单明了(与一重指针相似)