将 &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;
}
传递了指向原始对象的指针。所以通过这个指针改变参数将对原始对象完成。
基本上,我想知道为什么会这样(将列表的内存地址作为参数传递):
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;
}
传递了指向原始对象的指针。所以通过这个指针改变参数将对原始对象完成。