C++ 为什么可以';我不能将新元素推回列表吗
当我试图将新元素推回列表时遇到了一个问题 这个问题是根据PushBack()在主体中的调用编写其函数实现。所以我的问题是关于函数C++ 为什么可以';我不能将新元素推回列表吗,c++,pointers,reference,C++,Pointers,Reference,当我试图将新元素推回列表时遇到了一个问题 这个问题是根据PushBack()在主体中的调用编写其函数实现。所以我的问题是关于函数PushBack() 我将指针data传递到changeVal(),可以在函数内部更改内容。我不太明白两者之间的区别 我在网上找不到一些有用的解释,所以我在这里问 否,MakeNode()的返回类型是Node*。您可以将一个类方法声明为static,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,static不是返回值的一
PushBack()
我将指针data
传递到changeVal()
,可以在函数内部更改内容。我不太明白两者之间的区别
我在网上找不到一些有用的解释,所以我在这里问
MakeNode()
的返回类型是Node*
。您可以将一个类方法声明为static
,这样您就可以调用该方法,而无需事先调用该类的实例,您可以在类类型本身上调用该方法。在这种情况下,static
不是返回值的一部分,而是类方法本身的一部分。至于PushBack()
,没有静态
函数参数。该函数作用于节点
类的特定实例,因此它只是一个常规指针
simple
参数声明为Node*
时,您正在按值传递Node*
变量。该参数接收节点*
变量的当前值的本地副本。函数读取或更改参数值所做的任何操作都是使用该副本而不是原始变量来完成的。这就是为什么退出PushBack()
时,main()
中的simple
变量没有改变的原因
另一方面,当您将简单
参数声明为节点*&
时,您通过引用传递节点*
变量。该参数接收原始节点*
变量的内存地址。函数读取或更改参数值所做的任何操作都直接使用原始变量,而不是副本。这就是当退出PushBack()
时,main()
中的simple
变量发生变化的原因
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
变量发生变化的原因
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]