传递& var到* var和var到var有什么区别?

时间:2015-03-01 19:54:26

标签: c pointers parameters reference linked-list

基本上,我想知道为什么(将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的内存地址,后者将获得它引用的值。通过这个概念,两个代码段应该是等价的,但第一个运行正常,而第二个编译,但给我一个运行时错误。那是为什么?

1 个答案:

答案 0 :(得分:1)

在此功能中

void init_lista (elemPtr list) {
    list = NULL;
}

list是函数的局部变量。你可以想象它像

void init_lista () {
    elemPtr list = NULL;
}

退出函数后,变量将被销毁。原始参数不会更改,因为它是按值传递给函数的。因此该函数处理原始对象的副本。

在此功能中

void init_lista (elemPtr *list) {
    *list = NULL;
}

传递指向原始对象的指针。因此,将通过此指针更改参数,以便对原始对象进行更改。