回复 楼主 yang0401
要了解这个问题,你需要弄明白两个方面:
1、指针是什么?
2、函数调用过程中参数的堆栈操作。
以你提出的问题为例:
void insert(list* &p)
{
}
为什么函数参数里面有了&,就能改变指针p的值。
在调用前,需要申请一个变量作为参数:
list* cur_p;
假设 cur_p 指向地址 0x00379c;
如果参数中没有&,
void insert(list* p)
{
p = 0x003798;
}
你传入的参数为cur_p,也就是0x00379c,形参为p;
在函数调用过程中,形参进栈,也就是栈内地数据为0x00379c,当你修改形参的值,即堆栈中的p值为0x003798;当函数结束时,参数出栈,实参cur_p的值不会有什么变化。
通俗地说,这个操作只是函数堆栈的操作,和实参八辈子没有关系。
如果参数中有&,
void insert(list* &p)
{
*p = 0x003798;
}
你传入的是参数cur_p的地址,假设存放cur_p的空间为0x002634,即空间0x002634存放的值为0x00379c,而0x00379c又是某个list的地址。
形参的进栈出栈同上,但是中间操作时,不是把堆栈中的值改为0x003798,注意那个*号,而是把堆栈中存放值0x002634空间中的数0x00379c改为0x003798。
这是在内存空间中的修改,即使函数结束,形参出栈,内存中的值已经修改成功。
也就是你说的能修改指针P的值。
有什么不清楚的地方,可以继续提问。
[
本帖最后由 silent_world 于 2011-9-29 18:22 编辑 ]