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

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

在这个function

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

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

 void init_lista () { elemPtr list = NULL; } 

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

在这个function

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

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