Что означает * ptr2 = ptr? - PullRequest
       10

Что означает * ptr2 = ptr?

0 голосов
/ 20 января 2020

В настоящее время я работаю над двусвязным списком для одного из моих классов. Один из наших стресс-тестов выглядит следующим образом:

//Delcarations
DLList<string> list;
DLList<string>* list2;

list.clear();                         //Clears the list
list2 = &list;                        //Sets the values to be the same
list.addHead("I'm meant to be here"); //Adds this as head of both lists
*list2 = list;                        //Unsure what this does
printFunc(*list2);                    //prints the contents of the list

Мой блок вывода показывает, что list и list2 становятся NULL, а когда я печатаю *list2, он печатает NULL.

Мои вопросы:

  1. Что на самом деле делает *list2 = list
  2. Почему мои ценности становятся равными NULL?

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Два ваших комментария неверны. Возможно, исправленные комментарии прояснят ситуацию? (Я предполагаю, что имена функций указывают на то, для чего они предназначены, хотя такие предположения не всегда точны.)

list2 = &list;                        //Sets the values to be the same

Нет, это вызывает list2, чтобы указать на список, который вы только что очистили. Существует только один список, только один набор значений в списке.

list.addHead("I'm meant to be here"); //Adds this as head of both lists

Нет, список только один. Это добавляет «Я должен быть здесь» к началу списка .

*list2 = list;                        //Unsure what this does

Это берет список, на который list2 указывает ( aka list на две строки ранее) и заменяет его содержимое содержимым list. То есть он выполняет самоназначение способом, который может не обнаруживаться компилятором go, следовательно, он может избежать оптимизации. (Он также может go не быть обнаружен студентом, пытающимся пройти стресс-тест.;)) Логически, однако, эта строка функционально такая же, как list = list;.

printFunc(*list2);                    //prints the contents of the list

Это печатает ноль? Это говорит о том, что ваш оператор присваивания неправильно обрабатывает самопредставление.

1 голос
/ 20 января 2020

*list2 = list меняется значение данных указатель list2 указывает. Оператор *, предшествующий указателю, будет ссылаться на данные по адресу, сохраненному в указателе (известный как разыменование ).

В основном list2 - это указатель, который хранит адрес, который указывает в памяти, где находится list (это произошло, когда вы написали list2 = &list). Вы используете *list2 до go до данных, хранящихся по адресу, и меняете их на list, когда у вас есть объявление *list2 = list;.

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