Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Не изменяется указатель в Delphi

#delphi #pascal #указатели #память #freepascal


 ToDel := root^.right;
 ToDel := ToDel^.right;


После этих 2 строчек кода root^.right не изменяется.

root^.right := root^.right^.right;


А после этой изменяется , как сделать что бы в первом случае также изменялось ?

    TNode = ^Node;
     Node = record
            key :TKey;
            data :TData;
            left, right,parent:TNode;
         end;
root : TNode;
ToDel: TNode;

    


Ответы

Ответ 1



Все логично. ToDel := root^.right; копирует указатель из right в ToDel. Указатель в root и не должен поменяться. Если вам нужно поменять root, делайте так: ToDel := root^.right; root^.right := ToDel^.right; // здесь нужно освободить память, на которую указывает ToDel, если она вам больше нужна. P.S. Типы для структур лучше называть с буквой T в начале (от слова Type), а типы для указателей называть с буквой P в начале (от слова Pointer). тогда будет проще и вам и другим разбираться в вашем коде. PNode = ^TNode; TNode = record key: TKey; data: TData; left: PNode; right: PNode; parent: PNode; end;

Ответ 2



root^.right указывает на область памяти, в которой находится структура Node. После ToDel := root^.right; ToDel тоже указывает на эту же область памяти. В этот момент root^.right и ToDel - два независимых указателя, которые указывают на одно и то же. От того, что Вы измените ToDel, никакой другой указатель не изменится. Bonus question: После назначения root^.right := root^.right^.right; сохраняется ли где-нибудь старый адрес root^.right, и очищается ли память распределенная для этой структуры?

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

Отправить комментарий