Как ссылка на указатель работает в C ?

#c #pointers #linked-list

#c #указатели #связанный список

Вопрос:

У меня есть 3 указателя:

 Node* head;
Node* temp=head;
Node* p=new Node(2);
 

Теперь я назначаю:

 temp->next=p
 

Будет ли изменен следующий заголовок?

 head->next=?
 

Комментарии:

1. Ни next один из head них не будет изменен при записи temp->next=p; . Это может измениться, но для этого вы должны рассказать нам больше о том, как на самом деле выглядит ваша структура данных. Итак, реальный ответ: «он может / не может меняться в зависимости от того, какая у вас структура». Если кто-нибудь скажет вам «да» или «нет» со 100% гарантией, он / она будет лгать, поскольку вопрос является неполным, поскольку он не дает никакой информации о том, как Node выглядит.

2. Да, если head бы это действительно указывало на некоторую выделенную память, temp указывало бы на ту же память.

3. Если head указать на Node объект, temp будет указывать на тот же Node объект. Изменение этого объекта с помощью любого указателя изменяет этот объект.

4. @JasonLiam Я не понимаю вашу аргументацию. head и temp указывайте на одну и ту же память независимо от того, как выглядит структура. head->next и temp->next это одно и то же, поэтому любое назначение temp->next изменится head->temp . 100% гарантия.

5. Ключевое слово, которое вы должны искать, — это псевдоним .

Ответ №1:

Да, если head бы это действительно указывало на некоторую выделенную память, temp указывало бы на ту же память.

Пример:

 #include <iostream>

struct Node {
    Node(int X) : x(X) {}
    int x;
    Node* next;
};

int main() {
    Node* head = new Node(1);

    Node* temp = head;                     // temp points to the same memory as head

    Node* p = new Node(2);
    temp->next = p;                        // head->next is the same as temp->next

    std::cout << head->next->x << 'n'     // prints 2

    delete head;
    delete p;
}