ВУЗ:
Составители:
Рубрика:
10
p:=@i;
preal(p)^:=3.14;
мы обратимся к участку памяти, по которому расположено значение целой пере-
менной i, как к вещественной переменной. Поскольку данные вещественного ти-
па занимают в памяти 8 байт (в Delphi), а данные целого типа – всего 4 байта, то
последнее присваивание не только изменит 4 байта, занимаемые переменной i, но
и запишет оставшиеся 4 байта в область
памяти, следующую за переменной i.
Поскольку обычно память под глобальные переменные выделяется подряд в по-
рядке их описания, то оставшиеся 4 байта запишутся в область памяти, отведен-
ную под переменную r (именно она описана вслед за i), то есть в результате по-
следнего присваивания значение переменной r будет испорчено. Подобная ошиб-
ка не
будет выявлена на стадии компиляции, а при выполнении программы про-
явится не при данном ошибочном присваивании, а позже, когда мы захотим вос-
пользоваться значением переменной r. Именно поэтому рекомендуется либо от-
казаться от использования бестиповых указателей, либо при их использовании
проявлять предельную аккуратность.
Приведем пример, в котором использование указателей pointer
оправдано.
Пример. Внутреннее представление значения real.
Зададимся целью посмотреть, как хранится в памяти переменная типа real.
Для этого запишем ее адрес в указатель pointer, после чего преобразуем его в
указатель на массив байтов и выведем этот массив на экран.
const sz = sizeof(real);
type Arr=array [1..sz] of byte;
PArr=^Arr;
var r: real;
p: pointer;
pb: PArr;
i: integer;
begin
readln(r);
p:=@r;
pb:=p;
for i:=1 to sz do
write(pb^[i],’ ’);
end.
Отметим одну особенность операции взятия адреса @. В Delphi ее результат
зависит от директивы компиляции {$T} («typed @ operator»). По умолчанию ус-
тановлена директива компиляции {$T-}: это означает, что результат операции @
имеет тип pointer. Если же установлена директива компиляции {$T+}, то ре-
зультат операции @ – типизированный указатель, базовым типом для которого
Страницы
- « первая
- ‹ предыдущая
- …
- 6
- 7
- 8
- 9
- 10
- …
- следующая ›
- последняя »