русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Указатели


Дата добавления: 2013-12-23; просмотров: 635; Нарушение авторских прав


Динамические структуры данных

END.

CLOSE(F);

UNTIL EOF(F);

WRITE(C);

READ(F,C);

REPEAT

WRITE(K);

READ(F,K);

RESET(F);

BEGIN

VAR

PROGRAM FILE_TEXT_READ;

F:TEXT;

C:CHAR;

K:BYTE;

ASSIGN(F,'PRIMER1.TXT');

 

В этом случае первые два символа 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.


<== предыдущая лекция | следующая лекция ==>
WRITE(F,K,X,S,B) | История ИНТЕРНЕТ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.