Односвязный список C++

Всех приветствую! Есть несколько недопониманий касаемо кода программы. Знаю, что тут не любят подобные вопросы, но все же. 1) Насколько я понимаю все указатели типа Node* имеют поля данной структуры, тогда в 22 строчке (tmp = nd) мы присваиваем указателю tmp только ссылку или все поля tmp становятся равными полям nd + присваивание самой ссылки? 2) Не совсем понимаю как я связываю узлы между с собой, если меняется только tmp? 3) Откуда у tmp значение в поле val? Значения полей указателей зависят от адреса, который они хранят?

#include <iostream>
#include <vector>

struct Node {
    Node* NextNode = nullptr;
    int val = 0;
    
};

struct forward_list {
    Node* start;
    Node* tmp;
    forward_list() : start (nullptr) , tmp (nullptr)
    {}

    void push(int val) {
        Node* nd = new Node;
        nd->val = val;
        nd->NextNode = nullptr; 
        if (start == nullptr) {
            start = nd;
            tmp = nd;
            return;
        }
        tmp->NextNode = nd;
        tmp = tmp->NextNode;
    }
    void printList()
    {
        Node* tmp = start;
        while (tmp!= NULL)
        {
            std :: cout << tmp->val << std :: endl;
            tmp = tmp->NextNode;
        }
    }
};
    


int main()
{
    
    using namespace std;
    
    forward_list list;
    list.push(1);
    list.push(2);
    list.push(3);
    list.printList();
    
}

Ответы (0 шт):