я хочу знать, что делает следующий указатель приравнивая? - PullRequest
2 голосов
/ 04 июня 2019

У меня есть код ниже:

struct node {
    int data;
    node* next;
};

node* ptr1 = new node;
node* ptr2 = new node;
node* ptr3 = new node;

ptr1->data = 1;
ptr1->next = ptr2;

ptr2->data = 2;
ptr2->next = ptr3;

ptr3->data = 3;
ptr3->next = NULL;

*(ptr1) = *(ptr2);

node* temp;
temp = ptr1;

while (temp != NULL)
{
    cout << temp->data << " ";
    temp = temp->next;
}

Я ожидал, что выход будет:

2 2 3

т.е. значение вадрес ptr теперь должен быть равен значению по адресу ptr2, поскольку ptr1 и ptr2 фактически указывают на часть данных узла .. (как я увидел, печатая значения адреса)

но вывод:

2 3

Я ожидал, что мой вывод, потому что когда я печатаю *(ptr2), (используя printf, а не cout; cout показывает ошибку), я получаю вывод как:

2

Пожалуйста, кто-нибудь объясните, что происходит.Что делает *ptr1 = *ptr2?

Ответы [ 5 ]

6 голосов
/ 04 июня 2019
*(ptr1) = *(ptr2);

в этой ситуации эквивалентно:

ptr1->data = ptr2->data
ptr1->next = ptr2->next

, то есть все члены вашей структуры, подвергаются повторному заражению, поэтому ваш ptr1->next больше не указывает на узел ptr2, а напрямую указывает на ptr3, поэтому вместо 3 * 1008 печатаются только 2 значения

Вы вышли из этого:

[ptr1]==>[ptr2]==>[ptr3]

к этому:

[ptr2]==>[ptr3]
[ptr1]==>[ptr3]
2 голосов
/ 04 июня 2019

* (ptr1) = * (ptr2); копирует данные и следующий ptr портит связанный список. Вы только хотите скопировать данные. Так и должно быть

ptr1->data = ptr2->data
1 голос
/ 04 июня 2019
ptr1   ->    ptr2    ->     ptr3
 1            2              3

Когда * (ptr1) = * (ptr2), структура выглядит следующим образом:

ptr1    ->     ptr3
 2              3

                ^
                |
                |
               ptr2
                2

Надеюсь, понятно, почему сейчас печатается 23 :)

1 голос
/ 04 июня 2019

В этом утверждении

*(ptr1) = *(ptr2);

объект типа struct node, на который указывает указатель ptr2, назначается объекту того же типа struct node, на который указывает указатель ptr1.

Итак, в результате вы получите

ptr1 -> { 2, ptr3 }
ptr2 -> { 2,  ptr3 }
ptr3 -> { 3, nullptr }

Итак, в этом цикле, который начинается с ptr1

temp=ptr1;
while(temp!=NULL)
{

    cout<<temp->data<<" ";
    temp=temp->next;
}

отображаются два объекта, обозначенные ptr1 (что в свою очередь указывает на ptr3), и объект, на который указывает ptr3.

Ссылка на ptr2 в объекте, на который указывает указатель ptr1, потеряна. Теперь элемент данных next объекта указывает непосредственно на объект, на который указывает указатель ptr3.

0 голосов
/ 04 июня 2019
*(ptr1) = *(ptr2);

Здесь вы меняете базовую ячейку памяти ptr1 будет точно таким же, как ptr2, что дает эффект повторения, начиная с ptr2 (именно поэтому на выходе получается 2 3).

Если вы хотите, чтобы вывод был 2 2 3 вам придется изменить данные в ptr1:

ptr1->data = ptr2->data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...