68986

Операції над змінними вказівного типу

Лекция

Информатика, кибернетика и программирование

Оператор присвоєння записують так само як і для інших типів: S:=r; де 5 змінна вказівного типу r може бути змінною цього ж вказівного типу функцією тобто значенням якої є вказівник цього ж вказівного типу або порожній вказівник nil. Для введених нами раніше змінних вказівного типу...

Украинкский

2014-09-28

52 KB

0 чел.

Лекція № 15

Тема: Операції над змінними вказівного типу

План заняття:

  1.  Операції над змінними вказівного типу
  2.  Особливості роботи з динамічними змінними

Операції над змінними вказівного типу

Над змінними вказівного типу не визначені жодні операції, які б приводили до значень цього ж типу. З ними виконують тільки операції присвоєння і порівняння. Оператор присвоєння записують так само, як і для інших типів:

S:=r;

де 5 - змінна вказівного типу, r може бути змінною цього ж вказівного типу, функцією, тобто значенням якої є вказівник цього ж вказівного типу або порожній вказівник nil. Для введених нами раніше змінних вказівного типу р і q оператор

p:=q;

недопустимий, оскільки ці змінні різного типу: р вказує на змінну дійсного типу, q - цілого.

Щоб відчути різницю між присвоєнням значень вказівникам і об'єктами, на які вони вказують, розглянемо такий приклад (рис.1.):

                  k

                  j

Рис.1. Два динамічні об'єкти.

На рис. 1. k та j - вказівні змінні, що вказують на певні об'єкти однакового типу. Після виконання оператора

k:=j;

виникне ситуація, відображена на рис.2 і об'єкт * стане недоступним, буде втрачений. На його місці можна розмістити інший об'єкт після додаткової операції.

Рис. 2 Результат перетворення вказівника.

Якщо ж виконати оператор k^:=j^, то виникне ситуація, відображена на рис.3 

Рис. 3 Результат переприсвоєнь динамічного об'єкта.

Після виконання k:=nil матимемо випадок, показаний на рис. 4.

Рис. 4. Результат занулення вказівника.

Розглянемо ще приклад з числовими об'єктами. Нехай описані вказівні змінні m та l:

var m,l: ^integer;

і визначені відповідні їм динамічні об'єкти - змінні цілого типу

new(m);

new(l);

Присвоєння m^:=8; l^:=19 приводить до ситуації, показаної на рис.5.

Рис.5. Ініціалізація змінних з вказівниками.

Якщо тепер виконати присвоєння m:=l, то одержимо випадок, відображений на рис. 6.

Рис.6. Результат переприсвоєння вказівної змінної.

А якщо виконати присвоєння m^:=i^, то це приведе до ситуації з рис. 7.

Рис. 7. Результат переприсвоєння змінної з вказівником.

Особливості роботи з динамічними змінними

Під час роботи з динамічними об'єктами треба дотримуватись такого правила: вивільняти області пам'яті, виділені під динамічні змінні, якщо їх згодом не використовують. Інакше використання динамічних змінних призводить до швидкого "засмічення" динамічної пам'яті та її переповнення.

Ще одна особливість пов'язана зі стековим принципом розміщення статичних змінних, якими можуть бути вказівні змінні. Розглянемо такий приклад:

program Noreference;

type anketa=record

........

end;

aan=^anketa;

procedure GetAnketa;

var an:aan;

begin

an:=New(aan);

end;

begin

writeln(MemAvail);

GetAnketa;

writeln(MemAvail);

end.

Тут після виходу з процедури GetAnketa втрачено доступ до змінної an вказівного типу, а отже, і до динамічного об'єкта, на який вона вказує. Водночас об'єкт типу anketa залишається в динамічній пам'яті, його місце не вивільняється, що підтверджує результат виведення розміру вільної динамічної пам'яті перед і після виконання процедури. В описаному прикладі маємо втрату вказівки на динамічний об'єкт. Щоб уникнути таких випадків, треба під час виходу з блоку (процедури), в якому описані локальні змінні, що є вказівниками на відповідні динамічні об'єкти, або знищувати ці об'єкти, якщо вони надалі непотрібні, за допомогою процедури Dispose, або зберегти вказівники на них, присвоївши їх, наприклад, глобальним змінним.

Може виникнути протилежна ситуація, коли деяка область пам'яті вивільнена, а в програмі залишилася вказівка на неї. Розглянемо такий приклад:

var

q: ^rеаІ;

procedure p1;

var r: real;

begin

r:=10.5;

q:=@r;

writeln(q^);

end;

procedure p2;

var s: real;

begin s:=20.5;

writeln(q^)

end;

begin

p1;

p2

end.

У цьому прикладі використана унарна (що виконується з одним операндом) операція @ - обчислення адреси змінної r (взяття вказівника), що визначена в Турбо Паскалі. Присвоєння цієї адреси вказівній змінній q надає їй значення вказівника на змінну r. Під час виконання програми будуть послідовно виведені значення 10.5 і 20.5, хоча виводиться одна й та ж область пам'яті - та, на яку вказує вказівник q. Причина полягає в тому, що у разі виходу з процедури Р1 локальна змінна r перестає існувати, а вказівник на цю область залишається, оскільки q - глобальна змінна. В процедурі Р2 вводиться змінна s, яка згідно зі стековим принципом розподілу пам'яті розміщується на місці r.


*

**

**

*

**

**

**

8

19

19

8

19

19


 

А также другие работы, которые могут Вас заинтересовать

84231. НЕКРОЗ 24.24 KB
  Факторы вызывающие некроз: физические; токсические; биологические; аллергические; сосудистый; трофоневротический. зависимости от механизма действия патогенного фактора различают: прямой некроз обусловленный непосредственным действием фактора травматические токсические и биологические некрозы; непрямой некроз возникающий опосредованно через сосудистую и нервноэндокринную системы аллергические сосудистые и трофоневротические некрозы. морфологические признаки некроза.
84232. АПОПТОЗ. АТРОФИЯ 25.24 KB
  АТРОФИЯ Определение морфологические проявления апоптоза Определение классификация значение атрофии Апоптоз или запрограммированная смерть клетки представляет собой процесс посредством которого внутренние или внешние факторы активируя генетическую программу приводят к гибели клетки и ее эффективному удалению из ткани. При увеличении апоптоза наблюдается прогрессивное уменьшение количества клеток в ткани атрофия. Атрофия прижизненное уменьшение объема ткани или органа за счет уменьшения размеров каждой клетки а в дальнейшем числа...
84233. НАРУШЕНИЯ КРОВООБРАЩЕНИЯ 23.15 KB
  Общее артериальное полнокровие или артериальная гиперемия это увеличение числа форменных элементов крови эритроцитов иногда сочетающееся с увеличением объема циркулирующей крови. Общее венозное полнокровие один из самых частых типов общих нарушений кровообращения и является клиникоморфологическим проявлением сердечной или легочносердечной недостаточности. Общее венозное полнокровие может быть по клиническому течению острым и хроническим.
84235. Шок, виды шока 25.28 KB
  В основе этого вида шока лежит: уменьшение объема крови в результате кровотечения; чрезмерная потеря жидкости дегидратация; периферическая вазодилятация. При септическом шоке наиболее выражен ДВСсиндром потому что бактериальные эндотоксины обладают прямым действием на свертывающую систему крови. В основе развития анафилактического шока лежит гиперчувствительность реагинового типа обусловленная фиксацией IgE на базофилах крови и тканевых базофилах. В ответ на уменьшение сердечного выброса активируется симпатическая нервная система...
84236. ДВС-синдром. Местные расстройства кровообращения 25.33 KB
  Следует указать что диссеминированный тромбоз приводит также к израсходованию факторов свертывания крови с развитием коагулопатии потребления. Местное артериальное полнокровие артериальная гиперемия увеличение притока артериальной крови к органу или ткани. Постанемическая гиперемия гиперемия после анемии развивается в тех случаях когда фактор вызывающий местное малокровие ишемию быстро удаляется.
84237. ТРОМБОЗ 24.19 KB
  Образующийся при этом сверток крови называют тромбом. Свертывание крови наблюдается в сосудах после смерти посмертное свертывание крови. А выпавшие при этом плотные массы крови называют посмертным свертком крови.
84238. Эмболия. Тромбоэмболия сосудов большого круга кровообращения 25.08 KB
  Образование эмбола в венах большого круга кровообращения. Эмболы которые образуются в венах большого круга кровообращения или в правой половине сердца закупоривают артерии малого круга за исключением случаев когда они настолько малы что могут проходить через легочный капилляр. Эмболы которые возникают в ветвях портальной вены вызывают нарушения кровообращения в печени.
84239. Газовая эмболия. Жировая эмболия. Малокровие 24.13 KB
  Хотя механизм попадания жировых капель в кровоток при разрыве жировых клеток кажется простым есть еще несколько механизмов от действия которых зависят клинические проявления жировой эмболии. Типичные клинические проявления жировой эмболии: появление на коже геморрагической сыпи; возникновение острых рассеянных неврологических расстройств. Возможность развития жировой эмболии должна учитываться при появлении: дыхательных расстройств; мозговых нарушений; геморрагической сыпи на 1 3 день после травмы.