C++ 为什么可以';我不能将新元素推回列表吗

C++ 为什么可以';我不能将新元素推回列表吗,c++,pointers,reference,C++,Pointers,Reference,当我试图将新元素推回列表时遇到了一个问题 这个问题是根据PushBack()在主体中的调用编写其函数实现。所以我的问题是关于函数PushBack() 我将指针data传递到changeVal(),可以在函数内部更改内容。我不太明白两者之间的区别 我在网上找不到一些有用的解释,所以我在这里问 否,MakeNode()的返回类型是Node*。您可以将一个类方法声明为static,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,static不是返回值的一

当我试图将新元素推回列表时遇到了一个问题

这个问题是根据PushBack()在主体中的调用编写其函数实现。所以我的问题是关于函数
PushBack()

我将指针
data
传递到
changeVal()
,可以在函数内部更改内容。我不太明白两者之间的区别

我在网上找不到一些有用的解释,所以我在这里问

  • 否,
    MakeNode()
    的返回类型是
    Node*
    。您可以将一个类方法声明为
    static
    ,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,
    static
    不是返回值的一部分,而是类方法本身的一部分。至于
    PushBack()
    ,没有
    静态
    函数参数。该函数作用于
    节点
    类的特定实例,因此它只是一个常规指针

  • 当您将
    simple
    参数声明为
    Node*
    时,您正在按值传递
    Node*
    变量。该参数接收
    节点*
    变量的当前值的本地副本。函数读取或更改参数值所做的任何操作都是使用该副本而不是原始变量来完成的。这就是为什么退出
    PushBack()
    时,
    main()
    中的
    simple
    变量没有改变的原因

    另一方面,当您将
    简单
    参数声明为
    节点*&
    时,您通过引用传递
    节点*
    变量。该参数接收原始
    节点*
    变量的内存地址。函数读取或更改参数值所做的任何操作都直接使用原始变量,而不是副本。这就是当退出
    PushBack()
    时,
    main()
    中的
    simple
    变量发生变化的原因

  • 引用本质上是编译器管理的指针。不允许将其设置为NULL,并且每当您从/向其读取/写入值时,它都会自动取消引用。因此,如果将引用视为隐式指针,
    PushBack(节点*&)
    的功能等同于
    PushBack(节点**)
    (具有额外的编译器验证),类似于以下内容:

    void PushBack(Node** simple, Node* newNode){
        if (*simple == NULL){
            //still a empty list
            *simple = newNode;
        }
        else{
            //need to loop to the end of list because there is no "tail" in the class
            Node* itr = *simple;
            while (itr->next != NULL){
                itr = itr->next;
            }
            newNode->prev = itr;
            itr->next = newNode;
        }
        return;
    }
    
  • 否,
    MakeNode()
    的返回类型是
    Node*
    。您可以将一个类方法声明为
    static
    ,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,
    static
    不是返回值的一部分,而是类方法本身的一部分。至于
    PushBack()
    ,没有
    静态
    函数参数。该函数作用于
    节点
    类的特定实例,因此它只是一个常规指针

  • 当您将
    simple
    参数声明为
    Node*
    时,您正在按值传递
    Node*
    变量。该参数接收
    节点*
    变量的当前值的本地副本。函数读取或更改参数值所做的任何操作都是使用该副本而不是原始变量来完成的。这就是为什么退出
    PushBack()
    时,
    main()
    中的
    simple
    变量没有改变的原因

    另一方面,当您将
    简单
    参数声明为
    节点*&
    时,您通过引用传递
    节点*
    变量。该参数接收原始
    节点*
    变量的内存地址。函数读取或更改参数值所做的任何操作都直接使用原始变量,而不是副本。这就是当退出
    PushBack()
    时,
    main()
    中的
    simple
    变量发生变化的原因

  • 引用本质上是编译器管理的指针。不允许将其设置为NULL,并且每当您从/向其读取/写入值时,它都会自动取消引用。因此,如果将引用视为隐式指针,
    PushBack(节点*&)
    的功能等同于
    PushBack(节点**)
    (具有额外的编译器验证),类似于以下内容:

    void PushBack(Node** simple, Node* newNode){
        if (*simple == NULL){
            //still a empty list
            *simple = newNode;
        }
        else{
            //need to loop to the end of list because there is no "tail" in the class
            Node* itr = *simple;
            while (itr->next != NULL){
                itr = itr->next;
            }
            newNode->prev = itr;
            itr->next = newNode;
        }
        return;
    }
    
  • 否,
    MakeNode()
    的返回类型是
    Node*
    。您可以将一个类方法声明为
    static
    ,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,
    static
    不是返回值的一部分,而是类方法本身的一部分。至于
    PushBack()
    ,没有
    静态
    函数参数。该函数作用于
    节点
    类的特定实例,因此它只是一个常规指针

  • 当您将
    simple
    参数声明为
    Node*
    时,您正在按值传递
    Node*
    变量。该参数接收
    节点*
    变量的当前值的本地副本。函数读取或更改参数值所做的任何操作都是使用该副本而不是原始变量来完成的。这就是为什么退出
    PushBack()
    时,
    main()
    中的
    simple
    变量没有改变的原因

    另一方面,当您将
    简单
    参数声明为
    节点*&
    时,您通过引用传递
    节点*
    变量。参数接收存储器a
    void PushBack(Node** simple, Node* newNode){
        if (*simple == NULL){
            //still a empty list
            *simple = newNode;
        }
        else{
            //need to loop to the end of list because there is no "tail" in the class
            Node* itr = *simple;
            while (itr->next != NULL){
                itr = itr->next;
            }
            newNode->prev = itr;
            itr->next = newNode;
        }
        return;
    }
    
    PushBack(&simple, ...);
    
    [0001]->
    [0002]->
    [0003]->
    [0004]->
    ......
    [nnnn]->
    
    [0001]->NULL 
    [0002]
    [0003]
    [0004]
    ......
    [nnnn]
    
    [0001]->NULL 
    
    [0001]->newNode 
    [0002]
    [0003]
    [0004]
    ......
    [nnnn]