【问题标题】:What is the difference between passing &var to *var and var to var?将 &var 传递给 *var 和 var 传递给 var 有什么区别?
【发布时间】:2015-03-01 19:54:26
【问题描述】:

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

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

【问题讨论】:

  • 什么是elemPtr?它是某种指针的typedef吗?
  • 任何足够好的 C 编程书都能解释这一点。
  • 解释它取决于你的先验知识,可能需要几页。
  • 您看到的运行时错误是因为第二个代码示例没有更改main()list 的值。

标签: c pointers parameters reference linked-list


【解决方案1】:

在这个函数中

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

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

void init_lista () {
    elemPtr list = NULL;
}

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

在这个函数中

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

有一个指向原始对象的指针。因此,通过这个指针改变参数将对原始对象进行。

【讨论】:

  • 现在我明白了。我认为由于elemPtr 是指针类型,C 会将其视为引用参数。我想它不会那样工作。谢谢你,@vlad。
  • @xVictor 它是它指向的对象的引用,但不是它自己的引用。
猜你喜欢
  • 2023-03-25
  • 2013-06-28
  • 2015-05-08
  • 1970-01-01
  • 2019-09-21
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多