Работа с динамической памятью и указателями в системе Turbo Pascal. Мирецкий И.Ю - 6 стр.

UptoLike

Составители: 

При использование операции @ для формального параметра-значения будет построен указатель,
указывающий на ячейку стека, в которой содержится фактическое значение параметра. Предположим, что
Foo является формальным параметром-значением процедуры, а FooPtr является переменной указателем.
Если в процедуре выполняется операция
FooPtr := @Foo;
то FooPtr^ будет ссылкой на значение Foo. Однако, FooPtr^ не указывает на сам параметр Foo, поскольку
он указывает
на значение Foo, которое было взято из Foo и сохранено в стеке.
Применение оператора @ к параметру-переменной приведет к тому, что будет сформирован ука-
затель на фактический параметр (указатель берется из стека). Предположим, что One - параметр-
переменная процедуры, Two - переменная, передаваемая в процедуру в качестве фактического параметра
переменной One, а OnePtr является указателем на переменную. Если
в процедуре выполняется оператор:
OnePtr := @One;
то OnePtr является указателем на переменную Two, а OnePtr^ ссылка на саму переменную Two.
Оператор @ можно применять к процедуре или функции. При этом будет получен указатель на
ее точку входа. В Turbo Pascal не предусмотрен механизм для использования такого указателя. Единст-
венным применением указателя процедуры может быть передача его программе на языке
ассемблер или
использование в inline операторе.
Наконец, оператор @ можно применить к уточненному идентификатору метода, чтобы создать
указатель на точку входа метода.
4. Бестиповые указатели
Turbo Pascal содержит особый стандартный ссылочный тип, который позволяет не конкретизиро-
вать свой базовый тип, то есть тип указуемых значений. Этот тип имеет идентификатор Pointer и совмес-
тим со всеми
ссылочными типами. Например, описания
var
a : ^integer;
b : ^char;
c : pointer;
допускают присваивания вида
c := a;
c := b;
(присваивание a := b незаконно). Значения типа pointer называют нетипизированными указателями. Работа
с ними подразумевает обычно их преобразование в типизированные указатели, ссылающиеся на значения
определенного типа.
Тип Pointer хранится как двойное слово с частью смещения в младшем слове и с сегментной ча-
стью в старшем слове. Значение
указателя nil хранится как 0 в обоих словах.
Turbo Pascal содержит (дополнительно к New и Dispose) две процедуры GetMem и FreeMem рас-
пределения памяти, которые выделяют и освобождают области кучи без учета типа тех значений, которые
будут в них размещаться.
5. Приведение типов переменных
Ссылка на переменную одного типа может быть преобразована в ссылку на переменную другого
типа
с помощью приведения типов переменных.
приведение идентификатор типа ( ссылка на переменную )
типов
        При использование операции @ для формального параметра-значения будет построен указатель,
указывающий на ячейку стека, в которой содержится фактическое значение параметра. Предположим, что
Foo является формальным параметром-значением процедуры, а FooPtr является переменной указателем.
Если в процедуре выполняется операция

       FooPtr := @Foo;

то FooPtr^ будет ссылкой на значение Foo. Однако, FooPtr^ не указывает на сам параметр Foo, поскольку
он указывает на значение Foo, которое было взято из Foo и сохранено в стеке.

        Применение оператора @ к параметру-переменной приведет к тому, что будет сформирован ука-
затель на фактический параметр (указатель берется из стека). Предположим, что One - параметр-
переменная процедуры, Two - переменная, передаваемая в процедуру в качестве фактического параметра
переменной One, а OnePtr является указателем на переменную. Если в процедуре выполняется оператор:

       OnePtr := @One;

то OnePtr является указателем на переменную Two, а OnePtr^ ссылка на саму переменную Two.

        Оператор @ можно применять к процедуре или функции. При этом будет получен указатель на
ее точку входа. В Turbo Pascal не предусмотрен механизм для использования такого указателя. Единст-
венным применением указателя процедуры может быть передача его программе на языке ассемблер или
использование в inline операторе.

        Наконец, оператор @ можно применить к уточненному идентификатору метода, чтобы создать
указатель на точку входа метода.


                                       4. Бестиповые указатели
        Turbo Pascal содержит особый стандартный ссылочный тип, который позволяет не конкретизиро-
вать свой базовый тип, то есть тип указуемых значений. Этот тип имеет идентификатор Pointer и совмес-
тим со всеми ссылочными типами. Например, описания
        var
            a : ^integer;
            b : ^char;
            c : pointer;
допускают присваивания вида
            c := a;
            c := b;
(присваивание a := b незаконно). Значения типа pointer называют нетипизированными указателями. Работа
с ними подразумевает обычно их преобразование в типизированные указатели, ссылающиеся на значения
определенного типа.
        Тип Pointer хранится как двойное слово с частью смещения в младшем слове и с сегментной ча-
стью в старшем слове. Значение указателя nil хранится как 0 в обоих словах.
        Turbo Pascal содержит (дополнительно к New и Dispose) две процедуры GetMem и FreeMem рас-
пределения памяти, которые выделяют и освобождают области кучи без учета типа тех значений, которые
будут в них размещаться.


                                 5. Приведение типов переменных
        Ссылка на переменную одного типа может быть преобразована в ссылку на переменную другого
типа с помощью приведения типов переменных.

приведение        идентификатор типа           (          ссылка на переменную           )
типов