Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ОАиП.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
5.06 Mб
Скачать

Оператор @ с переменной

Использование @ с обычной переменной (не параметром процедуры) несложно.

Например, можно задать декларацию

Type

A = Array [0..99] of char; {Тип массива символов}

Var

X : Array [0..49] of integer; {Массив целых чисел}

pA : ^A; {Указатель на массив символов}

Объявлены переменные двух разных типов: массива целых из 50 элементов и ссылочного на тип А (массив из 100 символов). Чтобы указатель рА указывал на массив Х, надо присвоить ему адрес Х:

рА := @Х; {Указатель на массив целых чисел}

Теперь pA^ ссылается на массив целых, но по своей природе он указатель на массив символов, поэтому при обращении pA^[i] мы получаем содержимое отдельных байтов массива Х в символьной форме.

Пример. Компонентам массива целых присваиваются сдвинутые на 65 значения индекса, печатается массив целых. Переменной-указателю на символьный массив присваивается адрес массива целых. Снова распечатывается массив, но по адресам значений. Вместо последовательности чисел будет напечатана последовательность ASCII символов от А до z с пробелами.

Program ReInterpretation;

{Интерпретация массива целых чисел как массива из символов}

Uses

Crt;

Type

A = Array [0..99] of char; {Тип A – массив 100 символов}

Var

X : Array [0..49] of integer; {Массив целых чисел}

pA : ^A; {Указатель на массив символов}

i : integer;

Begin

ClrScr;

for i := 0 to 49 do

begin

X[i] := 65+i {65 – код буквы А}

write(X[i], ‘ ‘); {Печать чисел}

End;

pA := @X; {Указателю на А присваивается адрес массива целых чисел}

writeln;

for i := 0 to 99 do

write(pA^[i],’ ‘); {Печать символов}

End.

Попытка исполнить последний оператор до оператора pA := @X привела бы к ошибке, поскольку указатель на массив был бы не опpеделен. Массив Х имеет значения 65..114, которые не выходят за пределы младшего байта двухбайтовых элементов типа word. В старших байтах этой переменной – нули. При побайтной печати массива младшие байты выводятся как буквы алфавита, а старшие – как символ #0, который процедурой write интерпретируется как пробел.

Задание. Наберите программу, откомпилируйте ее и проверьте действие.

Оператор @ с параметром процедуры, переданным по значению

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

Например, пусть Х – формальный параметр процедуры, а рХ – указатель на него. Если в процедуре выполнено назначение

рХ := @Х;

то рХ^ указывает на значение Х, которое хранится в стеке.

Пример. Процедура Test присваивает локальному параметру р его адрес и выводит значение адреса в формате сегмент : смещение . Основная программа обращается к процедуре с фактическим параметром Р и выводит адрес фактического параметра.

Program FormalParam;

{Определение адреса формального параметра}

Uses

Crt;

Var

P : pointer;

Procedure Test(p: pointer);

Begin

p := @P; {Определение адреса локального параметра}

writeln (‘‘, Seg(p^), ‘:’, Ofs(p^));

End;

Begin

ClrScr;

Test(P); {Вызов процедуры}

writeln(‘‘, Seg(p^), ‘:’, Ofs(p^));

End.

На экран будет выведен результат исполнения программы:

В процедуре Р=1103:16378

В основной программе Р=0:0

Задание. Наберите программу, откомпилируйте ее и проверьте действие.