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

What is the difference between passing &var to *var and var to var?

基本上,我想知道为什么会这样(将列表的内存地址作为参数传递):

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的内存地址,后者获取其引用的值。通过这个概念,两个代码部分应该是等效的,但第一个运行良好,而第二个编译但给我一个运行时错误。这是为什么?

在这个函数中

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

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

void init_lista () {
    elemPtr list = NULL;
}

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

在这个函数中

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

传递了指向原始对象的指针。所以通过这个指针改变参数将对原始对象完成。