|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Виділення і звільнення динамічної пам’ятіТема: Динамічна пам’ять. Статичні і динамічні змінні. Статичними змінні - це змінні, які описані в реченні VAR, розміщуються в пам’яті перед виконанням програми і постійно там знаходяться. Динамічні змінні – це змінні, які розміщуються в пам’яті під час виконання програми і дають змогу звільняти пам’ять, коли необхідность в них відпадає. Динамічні змінні не мають імені, тому до них звертаються не по імені, а за їх адресою пам’ятi. Адреса зберігається в змінних особливого типу - вказівниках. Вказівник представляє собою змінну посилального (ссылочного) типу, яка інтерпретується як адреса байта пам’яті, що вміщує деякий елемент даних. Цим елементом може бути змінна, константа, адреса іншої змінної. Якщо ваша програма вміщує в розділі об’яв такий рядок VAR Number: integer; Даним рядком ви вказуєте на необхідність зарезервувати пам’ять визначеного розміру, на яку посилається змінна Number. Адресу памяті, за якою розміщена змінна Number, можна одержати за допомогою оператора @: P1:=@Number; або за допомогою функції Addr. В результаті виконання операції P1:=@Number адреса змінної Number записується в змінну P1. Адреса пам’яті представлена двома 16- розрядними словами. Динамічна пам’ять застосовується в випадках: 1) ваша програма повинна працювати з масивами, розмір яких перевищує 64 Кбайт; 2) ваша програма оперує даними, для яких не відомий необхідний розмір пам’яті; 3) в програмі використовується буфер для тимчасового зберігання даних; 4) ваша програма працює з даними, тип яких невідомий; Ваша програма використовує динамічні структури даних. При роботі динамічною пам’яттю адреси зберігаються в змінних особливого типу- вказівниках. Для звернення до динамічної змінної використовують ім’я вказівника, доповнене праворуч вертикальною стрілкою. Не існує констант типу вказівник, крім одної – nil, яка означає “пусту” адресу. Розрізняють вказівними на цілі, на дійсні, на масиви і взагалі – на будь-який тип даних. Ця різниця проявляється в опису вказівників, який має такий вигляд: ^ базовий тип Наприклад, Var P1: ^integer; PR: ^real; PA: ^array[1..1000] of real; Операції над вказівниками. Над вказівниками виконуються тільки операції присвоювання і порівняння. Вказівнику можна присвоїти вміст іншого вказівника того ж типу, константу nil або адресу об’єкту, визначеного за допомогою функції Addr(або оператора @). Наприклад, Pnt1, Pnt2: ^integer; Pnt3: ^real; X: integer; то операції присвоювання Pnt1:=nil; Pnt1:=Pnt2; Pnt2:=@x. Для одержання доступу до значення, яке зберігається в памяті за адресою, на яку посилається вказівник, необхідно після ідентифікатора вказівника ввести символ ^: Number^:=7. Буде записано число 7 в клітинку пам’яті, на яку посилається вказівник.
Виділення і звільнення динамічної пам’яті. В Турбо Паскалі існує два основних метода роботи з динамічною пам’яттю: за допомогою Процедур New, Dispose і процедур GetMem, FreeMem. Об’ємом динамічної пам’яті можна керувати через директиву компілятора $M, причому мінімальний розмір по замовчанню дорівнює нулю, а максимальний – об’єму всієї вільної базової пам’яті. Процедура New(P), де P- змінна посилального типу, створює динамічну змінну того типу, який визначається вказівником, і встановлює значення змінної P рівним адресі нової динамічної змінної. Var P1: ^integer; P2: ^string; Begin New(P1); New(P2); … end. Після ініціалізації вказівника можна розміщувати в пам’яті, на яку він посилається, будь-які дані відповідного типу. Var P1,P2: ^integer; … begin new(P1); new(P2); P1^:=7; { присвоюються дані} P2^:=7*2; P1:=P2;{присвоюється адреса} Попереднє значення P1 буде загублене, а дані стануть недоступними. Процедура Dispose(P), де P- змінна посилального типу, яка знищує динамічну змінну, на яку посилається вказівник P, тобто звільняє динамічну пам’ять. Перед кожним повторним викликом оператора New для одного і тож вказівника, необхідно викликати процедуру Dispose. Наприклад, ... Dispose(P); P:=NIL; … Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |