Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在C++;?(像堆叠一样处理它们)_C++ - Fatal编程技术网

C++ 为什么在C++;?(像堆叠一样处理它们)

C++ 为什么在C++;?(像堆叠一样处理它们),c++,C++,我有以下代码: #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, in

我有以下代码:

#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;
}
#包括
#包括
使用名称空间std;
结构节点{
英勇;
Nodo*siguiente;
};
//“简单”的清单,马尼普兰多拉·康埃尔·梅托多·利福(pila)。
void agregar_nodo(nodo*&cima,int n);//你是指什么?
int main(){
Nodo*cima=NULL;
agregar_nodo(cima,2);
agregar_nodo(cima,4);
返回0;
}
void agregar_nodo(nodo*&西马,国际北){
Nodo*nuevo_Nodo=new Nodo();/(struct Nodo)| Nodo()是一个非常有用的函数
新野->勇气=n;
新奥尔良->新奥尔良=cima;
cima=新诺多;
}
经过数小时的研究,我终于理解了代码的逻辑(它不是我的,它来自我所学的课程)。然而,在上述调查期间,我无法澄清三个疑问,即:

  • 为什么要用新的? 我的意思是,我认为没有必要使用它,为什么在这种情况下使用它? 在没有新代码的情况下,可以完成以前的代码吗?如果是那样的话,情况会怎样

  • 删除发生了什么? 我知道在c++中,每次使用新操作符时,都必须将其各自删除。为什么在这种情况下没有

  • 为什么通过引用传递指针?(函数“agregar_nodo”的第一个参数)

  • 这是最奇怪的,因为我知道在C中 引用是用指针生成的,但在C++中我们可以这样做 同时使用指针和一元运算符

    明白了这一点,我不认为将指针和一元运算符一起传递有什么意义,因为我知道这是不必要的。假设仅将其与指针一起使用将作为引用传递(尽管函数一如既往地制作副本,作为指针,我们将随身携带原始内存地址,即函数外部的地址)

    那么,为什么要将两者结合使用呢

    非常感谢。

    问题解答:

  • 如果您没有使用
    new
    ,那么您的
    Nodo
    对象将位于何处?他们必须是堆栈上的本地人或全局人。如果它们是局部变量,那么一旦声明它们的函数退出,它们就会消失。如果它们是全局的,那么无论您声明了多少,您只能使用一定数量的它们。如果每次有人调用
    agregar_nodo
    时都要扩展链接列表,那么每次都必须在堆上使用
    new
    分配一个新的
    nodo

  • 该程序是一个向您展示如何将元素添加到链接列表的示例。没有代码可以从链表中删除任何内容,而链表将使用
    delete

  • 代码正在向链表的前面添加新元素。每次在前面添加新元素时,它都必须更新“列表的开始”或“head”指针,以指向新的第一个元素。头指针(显然)是一个指针,
    agregar_nodo
    必须更新它,因此它作为指针的引用传入。有时程序会使用指向指针的指针(因此它可能是
    Nodo**cima

  • 最后一个有点棘手。如果以这种方式声明函数,而不使用引用:

    void agregar_nodo(Nodo *cima, int n)
    

    但是,当您运行它时,最后一行
    cima=nuevo_nodo
    将更新局部变量
    cima
    ,而不是
    main
    函数中的变量。因此,在第一次调用该函数之后,
    main
    中的
    cima
    仍然是
    NULL
    。因此,函数通过引用接受它,这样函数就可以在
    main

    1中更新
    cima
    。如果不动态分配此节点,而是自动分配它,那么当函数退出时,节点会发生什么情况?。如果静态分配节点以避开自动分配节点时出现的问题,那么可以有多少节点?2。考虑何时要删除节点。如果在添加节点之后但在删除节点之前删除了节点,会发生什么情况?通过引用传递列表的根(或,在葡萄牙语中,顶部)的原因是,它在调用方也会发生变化(main的
    cima
    指向“agregar\u nodo”返回后的新节点)。在C语言中,传递指针的地址。这个有点奇怪。但请记住,指针只是另一个变量,但它恰好包含另一个对象的位置。如果按值传递变量,则得到一个副本。如果按值传递指针,仍然会得到指针的副本。如果更改了复制在函数中的位置,则原始副本将无法知道。@Retr0 Yes。在C中,指针到指针将是通过引用传递指针的最直接、最合理的方式。