我有以下代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Nodo{
int valor;
Nodo *siguiente;
};
// Lista enlazada "simple", manipulandola con el metodo LIFO (pila).
void agregar_nodo(Nodo *&cima, int n); // ¿Puntero por referencia?
int main(){
Nodo *cima = NULL;
agregar_nodo(cima, 2);
agregar_nodo(cima, 4);
return 0;
}
void agregar_nodo(Nodo *&cima, int n){
Nodo *nuevo_nodo = new Nodo(); // (struct Nodo) | Nodo() Se puede usar cualquier sintaxis
nuevo_nodo->valor = n;
nuevo_nodo->siguiente = cima;
cima = nuevo_nodo;
}
经过几个小时的研究,我设法理解了代码的逻辑(它不是我的,它来自我遵循的课程(。但是,在上述调查中,我无法澄清三个疑问,它们是:
为什么使用new? 我的意思是,我认为没有必要使用它,为什么要在这种情况下使用它? 以前的代码可以在没有新代码的情况下完成吗?在这种情况下,会怎么样?
删除操作发生了什么变化? 我知道在 c ++ 中,每次我们使用 new 运算符时,我们都必须将其各自的删除。为什么在这种情况下没有?
为什么要通过引用传递指针?(函数"agregar_nodo"的第一个参数(
这是最奇怪的,因为我知道在 C 中, 引用是用指针进行的,但C++我们可以做到 使用指针和一元运算符
。
清楚这一点,我看不出将指针与一元运算符一起传递的意义,因为我知道这是没有必要的。假设仅将其与指针一起使用将作为引用传递(尽管该函数一如既往地复制,作为指针,我们将拥有原始内存地址,即函数外部的内存地址。
那么为什么要同时使用两者呢?
谢谢。
问题的答案:
-
如果您不使用
new
那么您的Nodo
对象将存放在哪里?他们必须是堆栈上的本地人或全局变量。如果他们是本地人,那么一旦声明他们的函数退出,他们就会消失。如果它们是全局变量,则无论您声明了多少,您都只能使用一定数量的全局变量。如果你想在每次有人调用agregar_nodo
时扩展链表,那么你必须在堆上分配一个新的Nodo
,每次都有new
。 -
该程序是一个示例,向您展示如何将元素添加到链表。没有代码可以从链表中删除任何内容,这是使用
delete
的地方。 -
该代码正在将新元素添加到链表的前面。每次它向前面添加新元素时,它都必须更新"列表的开头"或"head"指针以指向新的第一个元素。头部指针(显然(是一个指针,
agregar_nodo
必须更新它,因此它作为对指针的引用传入。有时程序使用指针到指针代替(因此会Nodo **cima
(。
最后一个有点棘手。如果函数以这种方式声明,则没有引用:
void agregar_nodo(Nodo *cima, int n)
然后它仍然会编译,但是,当你运行它时,最后一行cima = nuevo_nodo
会更新局部变量cima
,而不是main
函数中的那个。因此,在您第一次调用该函数后,main
中的cima
仍然会NULL
。因此,该函数改为通过引用接受它,以便该函数可以在main
中更新cima
。