基本上,我想知道为什么(将list的内存地址作为参数传递):
void init_lista (elemPtr *list) {
*list = NULL;
}
int main(){
elemPtr list;
init_list(&list);
//[...]
}
与此不同(仅传递列表的内容):
void init_lista (elemPtr list) {
list = NULL;
}
int main(){
elemPtr list;
init_list(list);
//[...]
}
OBS: elemPtr是结构的指针类型(typedef struct elem *elemPtr
)。
我从&
和*
理解的是,第一个将获得var的内存地址,后者将获得它引用的值。通过这个概念,两个代码段应该是等价的,但第一个运行正常,而第二个编译,但给我一个运行时错误。那是为什么?
答案 0 :(得分:1)
在此功能中
void init_lista (elemPtr list) {
list = NULL;
}
list
是函数的局部变量。你可以想象它像
void init_lista () {
elemPtr list = NULL;
}
退出函数后,变量将被销毁。原始参数不会更改,因为它是按值传递给函数的。因此该函数处理原始对象的副本。
在此功能中
void init_lista (elemPtr *list) {
*list = NULL;
}
传递指向原始对象的指针。因此,将通过此指针更改参数,以便对原始对象进行更改。