将&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; }
传递指针指向原始对象。 因此,将通过此指针更改参数,以便对原始对象进行更改。