Ссылка на переменную одного типа может быть преобразована в
ссылку на переменную другого типа с помощью приведения типов пе-
ременных.
┌─────────────┐ ┌───┐ ┌──────────┐ ┌───┐
приведение ───>│идентификатор├──>│ ( ├──>│ссылка на ├──>│ ) ├─>
типов │ типа │ └───┘ │переменную│ └───┘
└─────────────┘ └──────────┘
Когда приведение типов применяется к ссылке на переменную,
ссылка на переменную рассматривается как экземпляр типа, предс-
тавленного идентификатором типа. Размер переменной (число байт,
занимаемых переменной) должен быть равен размеру типа, представ-
ленного идентификатором типа. После приведения типа переменной
можно указать один или несколько квалификаторов, если это допус-
кается указанным типом.
Примечание: Определять допустимость приведения типа
должен программист.
Приведем несколько примеров приведения типов переменных:
type
TByteRec = record
lo, hi: byte;
end;
TWordRec = record
low, high: word;
end;
TPtrRec = record
ofs, seg: word;
end;
PByte = ^Byte;
var
B: byte;
W: word;
L: longint;
P: pointer;
begin
W := $1234;
B := TByteRec(W).lo;
TByteRec(W).hi := 0;
L := $1234567;
W := TWordRec(L).lo;
B := PByte(L)^;
P := Ptr($40,$49);
W := TPtrRec(P).seg;
Inc(TPtrRec(P).Ofs,4);
end.
Обратите внимание на использование для доступа к младшим и
старшим байтам слова типа TByteRec: это соответствует встроенным
функциям Lo и Hi, только над левой частью в операции присваивание
может выполняться приведение типа. Отметим также, что для доступа
к младшим и старшим словам длинного целого, а также к смещению и
адресу сегмента указателя используются типы TWordRec и TPtrRec.
Borland Pascal также полностью поддерживает приведение типов
для процедурных типов. Например, имея следующие описания:
type
Func = function(X: Integer): Integer;
var
F: Func;
P: Pointer;
N: Integer;
вы можете построить следующие присваивания:
F := Func(P); { присвоить F значение процедурного типа в P }
Func(P) := F; { присвоить P значение процедурного типа в F }
@F := P; { присвоить F значение-указатель в P }
P := @F; { присвоить P значение-указатель в F }
N := F(N); { вызвать функцию через F }
N := Func(P)(N); { вызвать функцию через P }
Обратите в частности внимание на операцию получения адреса
@, которая применяется к переменной процедурного типа. Ее можно
использовать в левой части присваивания. Кроме того, отметьте
приведение типа на последней строке при вызове функцию через пе-
ременную-указатель.