В этом случае первые два символа 25 преобразуются в целое значение, которое присваивается переменной K, а все остальные символы последовательно читаются в символьную переменную С, как и в примере 8.
При работе со статическими переменными может возникнуть ситуация, когда места, отведенного под хранение данных окажется недостаточно для решаемой задачи (Borland Pascal). Одним из способов увеличения объема доступной памяти может быть разделение программы на модули, каждый из которых имеет свой сегмент данных. Однако наиболее кардинальным решением является использование в программе динамически выделяемой памяти и указателей.
В отличии от статической переменной, в переменной-указателе хранятся не сами данные, а адрес (указание) места, где их можно найти (привести графическую интерпретацию). Указатели бывают нетипизированные и типизированные. Для обозначения первых служит зарезервированный тип pointer, для вторых - значок "А" с указанием типа, например:
Чтобы указать, что переменная-указатель не ссылается на ячейку памяти, используется ключевое слово nil;
var p : pointer; pI1, pI2 : ^integer; pD : ^double; I1, I2 : integer; D : double; begin I1:= 5; I2:= 7; D := 5.4; pI1 := addr(I1); pI2 := addr(I2); pD := addr(D); pI1^ := 10; {I1 = 10} pI2^ := 12; {I2 = 12} pD^ := 6.7 {D = 6.7} pI1 := pI2; pI1^ := 16; {I2 = 16}; p := pI1; {p ссылается на I2} pD := p; {pD ссылается на I2, что допустимо, но может привести к ошибке} pD := pI2; {ошибка, так как указатели типизированные} p := nil; {указатель p теперь никуда не указывает} end.
Таким образом, использование типизированных указателей может предотвратить ошибки, но снижает гибкость программы.
Использование указателей наиболее оправданно при работе со сложными структурами с применением динамического выделения памяти. Для выделения памяти и ее освобождения могут быть использованы пары New - Dispose, GetMem - FreeMem с применением SizeOf.
procedure New(var p : pounter) procedure Dispose(yar p : pointer) procedure GetMem(var p : pointer; Size : integer) procedure FreeMem(var p : pointer; Size : integer) function SizeOfX : integer
Приведение типов:
type PInteger = ^integer; var i : integer; p : pointer; begin i := 7; p := addr(i); pinteger(p)^ := 12; {i = 12} integer(p^) := 14; {i = 14} end.
Пример 1 (работа с памятью при обработке одномерных массивов):
type PMas = ^Mas; Mas = array[1..10] of integer; var p1, p2 : PMas; n : integer; begin New(p1); n := 5; GetMem(p2, SizeOf(integer)*n); … p2^[3] := 5; … Dispose(p1); FreeMem(p2, SizeOf(integer)*n); end.
Пример 2 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 1):
type PMas = ^Mas; Mas : array[1..1] of integer; var n,m,i,j,Temp : integer; Data : PMas; begin write('Введите количество строк и столбцов матрицы: '); readln(n,m); GetMem(Data,SizeOf(integer)*n*m); for i := 1 to n do for j := 1 to m do begin write('Введите Data[',i,',',j,']: '); readln(Data^[(i-1)*m+j]); end; for j := 1 to m do begin i := 1; while i<n do if Data^[(i-1)*m+j]<Data^[i*m+j] then begin Temp := Data^[(i-1)*m+j]; Data^[(i-1)*m+j]:= Data^[i*m+j]; Data^[i*m+j] := Temp; if i>1 then dec(i) else inc(i) end else inc(i); end; for i := 1 to n do begin for j := 1 to m do write(Data^[(i-1)*m+j],' '); writeln; end; FreeMem(Data,SizeOf(integer)*n*m); end;
Пример 3 (работа с памятью при обработке многомерных массивов на примере упорядочивания столбцов матрицы, вариант 2):
type PMas1 = ^Mas1; Mas1 = array[1..1] of integer; PMas2 = ^Mas2; Mas2 := array[1..1] of PMas1; var Data : PMas2; n,m,i,j,k,MaxI,Temp : integer; begin write('Введите количество строк и столбцов матрицы: '); readln(n,m); GetMem(Data,SizeOf(PMas1)*n); for i := 1 to n do GetMem(Data^[i],SizeOf(integer)*m); for i := 1 to n do for j := 1 to m do begin write('Введите Data[',i,',',j,']: '); readln(Data^[i]^[j]]); end; for j := 1 to m do begin for k := 1 to n-1 do begin MaxI := k; for i := k+1 to n do if Data^[i]A[j]>Data^[MaxI]^[j] then MaxI := i; Temp := Data^[k]^[j]; Data^[k]^[j] := Data^[MaxI]^[j]; Data^[MaxI]^[j] :=Temp; end; end; for i := 1 to n do begin for j := 1 to m do write(Data^[i]^[j],' '); writeln; end; for i := 1 to n do FreeMem(Data^[i],SizeOf(integer)*m); FreeMem(Data,SizeOf(PMas1)*n); end.