initlist(sqlist*&L)中的*&L是引用。c++中的概念,int a;int &b=a;这就声明了b是a的引用,经过这样的声明后使用a或b的作用相同,都代表同一变量。对变量声明一个引用,并不另开辟内存单元。
函数参数传递有两种情况,有一般的将变量名作为参数,这时传递给形参的是变量的值,在执行函数的时候,形参的值发生的变化并不传递给实参。
传递变量的指针,使形参得到一个变量的地址,这时形参指针变量指向实参变量单元。引进引用后,函数参数的第三种传递方式就是传送变量的别名。
例如:
void initList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));
L-> length=0;
}
SqList *L = NULL;
initList(L);
L->...//进行对L的某些操作,那么你的程序运行良好
扩展资料
在形参表中以符号“&”开始的参数即为引用参数。如果一个形参是引用参数,调用部位将把实参的地址传递给子程序。子程序可以改变传递给引用参数的任何实参,因为子程序操作的是真正的变量,而不是它的副本。
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制,在按值传递时,函数操纵的是实参的本地拷贝。
引用参数的三种常见用法:
1、需要改变实参的值,比如swap()。参数是引用时,函数接收的是实参的左值而不是值的拷贝。这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。
2、向主调函数返回额外的结果。
3、向函数传递大型的类对象。
参考资料来源:百度百科—引用参数
参考资料来源:百度百科—参数传递
void initlist(sqlist &L);意思是说,参数L是sqlist类型,且参数是以别名传参出现的。所谓别名的意思说就是,在这个函数中,函数可以修改L的修。
例如:
void add10(int &a)
{
a=a+10;
}
void main()
{
int n=10;
add(n);
printf("%d",n);
}
输出: 20
------------------------------
了解别名的用法后,我们就知道了。void initlist(sqlist* &L)的意思是说,参数L是sqlist的指针类型。且在函数中可以修改这个指针L。
c中没有引用符&,c++中有。如果是c中的函数,它只能被理解为形参L的地址是个基类型为sqlist的指针,相当于sqlist L.
在数据结构c描述中,却应用了c++中的引用符&。表示L是个基类型为sqlist的指针,并且它被引用,即L在此函数中并不分配内存,它直接引用主调函数中的L,在该函数中L的变化将自动带入主调函数中。
应该前面声明的是 sqlist *L.
因为函数调用是值传递的,initlist(sqlist*&L),不这样定义的话,那就在initlist()里没有对L进行操作,而是对函数的形参操作的,返回后L根本也没被分配空间。必须把L的地址传递给initlist()才可以的,这样定义相当于
这样定义:
sqlist *L
initlist(sqlist **L);
这样调用initlist(&L);