Головна

Дії над покажчиками

  1.  I. Дії водіїв на місці ДТП
  2.  II. Технологія індивідуального виховного взаємодії з дитиною
  3.  III. Розшукові версії і оперативно-розшукові дії
  4.  III. Технологія педагогічної взаємодії з батьками школярів
  5.  IV. Визначте, яке завдання взаємодії з практичним психологом поставив перед собою клієнт.
  6.  IX. Психомоторики: РУХУ, довільно РЕАКЦІЇ, ДІЇ, ДІЯЛЬНІСТЬ
  7.  Omega 3-6-9, як речовини глибинної дії, нормалізують жировий обмін і ведуть до зниження обсягів підшкірної жирової клітковини.

Присвоєння

Присвоєння для покажчиків зводиться до пересилання значення одного покажчика іншому. Сумісними з присвоєння є:

два покажчика одного і того ж типу;

константа NIL і вільний покажчик;

константа NIL і обмежений покажчик будь-якого типу;

вільний покажчик і обмежений покажчик будь-якого типу.

Обмеженому вказівником одного типу можна привласнити значення обмеженого покажчика іншого типу за допомогою функції приведення типів POINTER (але без крайньої необхідності робити це не слід, так як подібні дії призводять до порушення суворої типізації).

Кожен покажчик перед використанням необхідно форматувати, Тобто встановити на відповідний об'єкт.

Установка покажчика на об'єкт, адреса якого невідомий, проводиться за допомогою вбудованої функції взяття адреси - Addr (), Аргументом якої є ідентифікатор об'єкта. Ця функція повертає результат типу Pointer, В якому міститься адреса аргументу. Аналогічний результат повертає операція @.

 TypePPoint = ^ Point; Point = recordX, Y: wordend; PCircle = ^ Circle; Circle = recordR: word; Center: Pointend;  {Тип - покажчики на об'єкти типу ТОЧКА} {тип ТОЧКА} {тип - покажчики на об'єкти типу окружних} {тип окружних}
 Varop: Point; pp: PPoint; oc: Circle; pc: PCircle;  {Об'єкт ТОЧКА} {об'єкт - покажчик на об'єкт ТОЧКА} {об'єкт окружних} {об'єкт - покажчик на об'єкт окружних}
 beginop.X: = 100; op.Y: = 200; pp: = @op; pc: = addr (oc);  {Заповнення атрибутів об'єкта ТОЧКА} {установка покажчика на об'єкт ТОЧКА} {установка покажчика на об'єкт окружних}
 with oc dobegin R: = 5; with Center dobegin X: = 10; Y: = 20 end; end;  {Заповнення атрибутів об'єкта окружних}

Установка покажчика на об'єкт, адреса якого відомий і зберігається в іншому покажчику, проводиться за допомогою присвоювання.

Var

pp, pp1, pp2: PPoint; pc: PCircle; p: Pointer;

begin

pp1: = pp; p: = pc; pp2: = nil;

Результат виконання цих операцій ілюструється рис. 10.

       
 
   
 

Мал. 10. Присвоєння покажчиків

ДОСТУП ДО ОБ'ЄКТУ ЧЕРЕЗ УКАЗАТЕЛЬ. РОЗКРИТТЯ ПОСИЛАННЯ.

Доступ до об'єкту через обмежений покажчик пов'язаний з попередньою установкою покажчика на об'єкт і подальшим розкриттям посилання. При цьому ім'я покажчика використовується як ідентифікатор, за яким слід символ "^", (Тобто калідент з постфіксом "^" ). Доступ до об'єкту і його атрибутів здійснюється в кілька етапів:

ім'я покажчика - Покажчик використовується для отримання адреси того об'єкта, з яким він пов'язаний

ім'я покажчика ^ - Відкриває доступ до всього об'єкту, адреса якого зберігається в покажчику

ім'я покажчика ^.- Відкриває доступ до атрибутів об'єкта

ім'я покажчика ^ . ім'я атрибута - Відкриває доступ до конкретного атрибуту об'єкта.

Кожен з подібних квалідентов відкриває доступ до унікального об'єкту або атрибуту об'єкта.

Var p: PCircle;

p  {Доступ до об'єкта окружних}
 p ^ .R  {Доступ до атрибуту РАДИУС об'єкта окружних}
 p ^ .Center.X  {Доступ до атрибуту X об'єкта окружних}
 p ^ .Center.Y  {Доступ до атрибуту Y об'єкта окружних}

У загальному випадку розмір об'єкта типу покажчик, що не дорівнює розміру елемента зберігання об'єкта, доступ до якого він відкриває і не дорівнює розміру атрибута об'єкта, тобто

Sizeof (покажчик) # Sizeof (покажчик ^) # Sizeof (покажчик ^ .атрібут).

Для того щоб скоротити довжину дистанції доступу при ідентифікації зазначенням, можна використовувати оператор приєднання

WITH покажчик ^> DO begin приєднується фрагмент end;

 
 

Var oc: Circle; p: PCircle;

begin

p: = addr (oc);

with p ^ do begin

Center.X: = 10; Center.Y: = 20; R: = 5

end;

Будь-яке приєднання, оголошене оператором WITH, Виконується після того, як визначено значення присоединяющего квалідента (іншими словами, адреси того об'єкта, до атрибутів якого буде здійснюватися доступ через покажчик), тобто до "входу" в оброблюваний фрагмент. Зміна значення присоединяющего покажчика всередині приєднується фрагмента не змінить вже створеного приєднання. Тому перевстановлення покажчика, що приєднує до оброблюваного об'єкту, всередині приєднується фрагмента недопустима, а може виконуватися тільки до оператора WITH. Правильний приклад використання оператора приєднання наведено вище. Помилковий приклад слід далі:

Var oc1, oc2: Circle; p: PCircle;

begin

p: = @ oc1;

with p ^ do begin

p: = @ oc2; {Помилка: перевстановлення покажчика всередині

приєднується фрагмента}

p ^. R: = ...

end;

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

Var p, q: PCircle;

Begin

p ^. R: = 5; p ^. Center.X: = 10; p ^ .Center.Y: = 20; {* 1 *} q ^: = p ^; {* 2 *}

Виконання операторів {* 1 *} і {* 2 *} ілюструє рис. 11.

     
 
 
 

Мал. 11. Виконання операторів {* 1 *} і {* 2 *}

Оператор {* 2 *} еквівалентний наступної групи операторів:

q ^ .R: = p ^ .R; q ^ .Center.X: = p ^ .Center.X; q ^ .Center.Y: = p ^ .Center.Y;

Зауважимо, що з використанням приєднання цю групу операторів можна записати в такий спосіб:

with q ^ do begin

R: = p ^ .R; Center.X: = p ^ .Center.X; Center.Y: = p ^ .Center.Y

end;

або

with p ^ do begin

q ^ .R: = R; q ^ .Center.X: = Center.X; q ^ .Center.Y: = Center.Y

end;

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

ПОРІВНЯННЯ покажчиків.

Покажчики можна порівнювати між собою на рівність і нерівність. Два покажчика вважаються рівними, якщо вони вказують на один і той же об'єкт або обидва нікуди не вказують (обидва рівні NIL). Нерівні покажчики вказують на різні об'єкти або один з них нікуди не вказує. Покажчик можна порівнювати з константою NIL, Щоб дізнатися, посилається даний покажчик на конкретний об'єкт. Порядок обчислення булевских виразів в умовних операторах, що використовують доступ до атрибутів об'єктів через покажчики, дуже важливий. Наприклад оператор:

If (p <> nil) and (p ^. R = 10) then ...

буде працювати коректно, навіть якщо p = nil. У цьому випадку друга умова перевірятимуть не буде згідно з правилом обчислення булевских виразів.

оператор

 If (p ^. R = 10) and (p <> nil) then ...

є некоректним, тому що якщо p = nil, вираз p ^. R = 10 не має сенсу, оскільки покажчик p ні на який конкретний об'єкт не вказує.




 Види структур даних |  Розвиток концепції структуризації в програмуванні |  Поняття типу даних |  порядкові типи |  речові типи |  абстрактні типи |  іменування |  Пам'яті MS DOS |  класи пам'яті |  автоматична пам'ять |

© 2016-2022  um.co.ua - учбові матеріали та реферати