|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Управление динамической памятьюМы рассматривали указатели, содержащие адреса статических переменных. Переменной, на которую указывает указатель, не обязательно присваивать какое-либо имя. К ней можно обращаться через имя указателя. В этом и заключается основное назначение указателей – адресация так называемых динамических переменных. При объявлении данных динамической структуры в разделе описаний указывается не сама переменная какого-либо типа, а указатель (ссылка) на нее. В результате указатель будет обычной переменной, а переменная, на которую он указывает – динамической.
Такие переменные располагаются в свободной области, называемой динамической памятью или «кучей». Эта область расположена после программы, и ее объем составляет около 200…500 КБ (зависит от процессора), чем больше объем программы, тем меньше размер свободной области памяти.
Чтобы воспользоваться этой динамической областью памяти, необходимо сначала зарезервировать фрагмент этой области и запомнить ее адрес с помощью процедуры/функции New: 1. Процедура New (var p:pointer); - возвращает адрес выделенного участка памяти через параметр-переменную. Размер участка памяти определяется базовым типом указателя.
VAR pi:^integer; … New(pi); Readln(pi^); Pi^:=Pi^+1;
2. процедура Dispose (var p:pointer ) – освобождает память по адресу, хранящемуся в указателе. Dispose(p);…… Пример 4 Реализовать «безразмерный» массив целых чисел, длина массива задается с клавиатуры. Опишем массив из двух элементов. Выделим память под этот массив (new(t)). Перемещая указатель на второй элемент массива (t:=@t^[2]), мы «удлиняем» массив на 1 элемент. t
Type Mas=array[1..2]of integer; Uk_Mas=^Mas;
Var t,beg:Uk_Mas; i,n:integer;
procedure vivod(var beg:Uk_Mas;n:integer); var p:Uk_Mas; begin p:=beg; for i:=1 to n do begin write(p^[1]:4); p:=@p^[2]; end; end;
Begin new(t); beg:=t; readln(n); for i:=1 to n do begin write('Введите целое число: '); readln(t^[1]); t:=@t^[2]; end; writeln('Вывод массива:'); vivod(beg,n); readln end.
Упражнения Задание 1 Вывести значение элемента по заданному порядковому номеру элемента.
Задание 2 Написать программу, вычисляющую сумму матрицы вещественных чисел, имеющую большую размерность (n,m≤10 000). Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |