20 20 20
40
Здесь опять убеждаемся, что разыменованный указатель равнозначен переменной, на которую он ссылается. С ним выполняют те же действия, что и с переменной: ввод, вывод, арифметические операции и так далее.
В программе «P_51_2» мы ещё раз увидим это, а вдобавок исследуем размеры указателей на переменные разных типов, – отличаются ли они?
{ P_51_2 – Указатели разных типов, размеры указателей }
type PBool= ^boolean; { Тип указателя на булевскую переменную }
PInt = ^integer; { Тип указателя на целое число }
PStr = ^string; { Тип указателя на строку }
var B : boolean;
I : integer;
S : string;
pB : PBool; { Указатель на булевскую переменную }
pI : PInt; { Указатель на целое число }
pS : PStr; { Указатель на строку }
begin
{ Настройка указателей на переменные }
pB := @B; pI := @I; pS := @S;
{ Присвоение значений переменным через указатели }
pB^ := true;
pI^ := 10;
pS^ := 'Hello!';
{ Распечатка значений переменных }
Writeln(B:6, I:6, S:10);
{ Исследование размеров типов и указателей на них }
Writeln('Boolean = ',SizeOf(Boolean):6, SizeOf(PBool):6);
Writeln('Integer = ',SizeOf(integer):6, SizeOf(PInt ):6);
Writeln('String = ',SizeOf(String ):6, SizeOf(PStr ):6);
Readln;
end.
Вот «продукция» этой программы.
true 10 Hello!
Boolean = 1 4
Integer = 2 4
String = 256 4
Любопытны три последних строки. Они показывают, что размеры указателей на переменные всех типов одинаковы и для 32-разрядных систем составляют 4 байта (подобно тому, как размер конверта не зависит от размера дома, куда он адресован).
В следующей главе мы пожнем первые плоды от применения указателей, а пока подведем итоги.
• Память компьютера – это последовательность ячеек, которым назначены уникальные адреса.
• Объекты программы – переменные, процедуры и функции – занимают ячейки памяти, адреса которых можно определить операцией взятия адреса @ или функцией Addr.
• Для хранения адресов применяют переменные особого типа – указатели. Каждому типу переменных соответствует свой тип указателя.