русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

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


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


ВКАЗІВНИКИ.


Дата додавання: 2013-12-23; переглядів: 1761.


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

Var A,B: Integer;

За допомогою такого запису в пам'яті ЕОМ резервуються дві комірки, що маркіруються А і В. Якщо в програмі А і В присвоїти відповідні значення А:=2, В:=5, то ці комірки заповняться даними значеннями і при вказуванні в програмі на ідентифікатори А і В фактично вказується на зміст цих комірок, і відповідно на значення змінних.

Використовуючи вказівники, ми маємо справу з комірками, що мають імена. Однак, зміст такої комірки дає нам не значення змінної, а її

адресу. Отже вона є вказівником на комірку пам'яті, де зберігається потрібне значення. В звичайній змінній відразу після її опису резервується область пам'яті і ця область закріплюється за змінною на весь час роботи програми, такі змінні називаються статичними. При використанні вказівників, область пам'яті куди вони вказують, резервується під час виконання програми і здійснюється це за допомогою оператора New. Цю зарезервовану область ми можемо звільнити в процесі виконання програми для іншого використання. Оскільки у вказівників змінних область пам'яті може резервуватись, а потім знову звільнятись під час виконання програми, то їх називають динамічними змінними. Явно динамічна змінна не вказується в описі змінних і в них немає імені. Для доступу до них існують змінні спеціального типу даних, що називаються вказівниками. Задаються вони наступним чином:

 
 


<тип>;

^ <тип>;

Вказівниковій змінній може бути присвоєно пусте значення адреси, що позначається NIL Оператор B:=NIL; означає, що вказівникова змінна В не вказує ні на один динамічний об'єкт. Безпосередньо в програмі, якщо проводяться операції з вказівниками, то при цьому використовується або або ^

Розглянемо вираз: Var A,B: ^Integer;

Величини А і В являються вказівниками. Це говорить про те, що значення в комірках А і В дають адреси комірок пам'яті, куди наступними операціями можуть записуватись цілі змінні (оскільки опис ще не резервує пам'ять для запису цілих значень).

Якщо в програмі записана конструкція New (А);, то тоді резервується область в пам'яті. На цю зарезервовану область можна зсилатись, використовуючи вирази А^ або, говорять А з вказівником. І А^ дає нам вказану змінну (що дорівнює змісту пам'яті, куди вказує А).

Приклад:Знайти суму

1.Program рr;

2.VarA,B:^ integer;

3.К:integer;

4.Begin

5.New(A);A^:=l;

6.New(B);B^:=2;

7.К:=А+В;

8.Dispose(B);

9.Dispose (A);

10.Write (k);

11. End..

 

В рядку 2 описуються вказівники, в відповідності з вказівником Integer,

кожен з яких може вказувати на цілу змінну. Таким чином, в описі йде

спочатку вказівник, а далі опис відповідного типу.

В рядку 5 міститься оператор New(A);, тим самим резервується область в

пам'яті для запам'ятовування цілих числових значень. Оператор А^: =1;,

говорить нам, що змінній, на яку вказує вказівник А, присвоюється

значення 1. Після цього об'явлення рядок 6 записується аналогічно. В

рядку 7 видно, що А і В обробляються як звичайні змінні цілого типу. В

рядку 8 оператор DisPose означає звільнити зарезервовану область

в пам'яті для інших користувачів. Стан пам'яті після цього буде таким,

яким він був безпосередньо після опису змінної.

В більшості версій Pascal застосовувати оператор DisPose прямо не

можна, його потрібно записувати в зворотному порядку до того, в якому

записаний оператор New. Можна зробити висновок, що вказівники

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

пам'яті ЕОМ.

На практиці вказівники використовуються з іменами для побудови

визначених структур із змінних під час виконання програми. Таким

чином, один запис може зсилатись на інший. На практиці вказівники

застосовуються, щоб зв'язати записи один з одним. Крім того, цей

механізм дає можливість під час виконання програми визначити

необхідний об'єм пам'яті.

Приклад:які будуть приймати значення т^ та п^ після виконання

наступних операторів:

 

New(m); т^:=15;

New(n); п^: = -5;

т^ : = т^ + п^;

п^ : = п^ + 10;

якщо відомо, що

var m,n: ^integer;

Відповідь: т^:=10; п^:=5.

Приклад:що буде надруковано після виконання операторів:

New(x); x^:='с';

Write(x^); {c}

у:=х;

Writeln(y^); {с}

якщо відомо, що:

var x,y: ^char;

Приклад;відомо, що в Туре вказівник - ^real;

вектор =array[1.. 20] of вказівник;

var A вектор;

і: integer;

min:real;

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

 

Begin

Міп;=A^[1];

For і:=2 to 20 do

Begin

if тіп<A^[і] then min:=А^[і];

 

Якщо потрібно виділити пам’ять під масив, то необхідно виконати оператор NEW(A); а до елементів масиву можна звертатися, вживаючи ім’я A^[i];

Частіше всього вказівниковий тип даних використовується для організації динамічних спискових структур. До них відносяться: списки, дерева, кільця

Для задання спискових структур необхідно визначити об'єкт

комбінованого типу, до складу якого входить зсилка на об'єкт даного типу. В

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

Туре зсилка =^ елемент;

дані = < тип >;

елемент = record

с: вказівник; d: дані;

end;

Визначивши так вказівниковий тип, можна побудувати зв'язний однонаправлений список.

                   
 
Початок
   
С   D
 
C   D
 
C   D
 
NIL   D
 


Вказівник початку містить вказівник на перший елемент списку. Кожен елемент списку містить поле C- вказівник на наступний елемент і поле даних D, яке в свою чергу може бути достатньо складною структурою. Поле вказівника останнього елементу містить пусту зсилку NIL. Рухаючись по зсилкам, можна послідовно проглянути весь список. Якщо з списку потрібно видалити любий елемент крім першого, то для цього достатньо змінити поле вказівника попереднього елементу.

 
 

 


A K B

 

 

На цьому фрагменті показано видалення елементу К. Для цього адресу зсилки елементу В, який зберігається в полі вказівника елементу К, записують в поле вказівника елементу А. Після чого елемент А буде вказувати на елемент В, а елемент К стане недоступним, так як на нього нічого не вказує. Хай попередній - це змінна вказівникового типу, який містить вказівник на елемент, що передує видаленому, тоді операція виключення буде виглядати так:

 

Попередній^ .С:= попередній ^. С^ .С;

Читається так: іти по вказівнику, що зберігається в попередньому, взяти вказівник із поля С, йти по ньому, взяти вказівник з поля видаленого елементу.

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

 

Нов.^.С:=посл^ .С;

Посл^ .С:=нов;

Перший оператор заносить в поле вказівника елементу, що вставляється вказівникове значення, що вказує на елемент В і що містився раніше в К. Другий записує в поле вказівника елементу К вказівник на другий елемент.

Для додавання в кінець списку елементу х, достатньо знайти останній

елемент списку (у нього поле вказівника має значення NIL) і переслати в його поле вказівник на елемент, що додається. При цьому, поле зсилки елементу, що додається, повинно містити Nil.

Hoв^ .C:=Nil;

Посл^ .С:=нов;

Зазвичай, при побудові зв'язних списків вводять симетричну змінну, що вказує на початок списку, на його перший елемент. Тому при видаленні першого елементу, або при вставці нового елементу, на початку списку необхідно перевизначити не вказівник попереднього елементу, а значення

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

а операція вставки двома:

нов.^.С:=поч;

а операція вставки двома:

нов.^.C:=поч.;

поч: =нов;


<== попередня лекція | наступна лекція ==>
ПОСЛІДОВНИЙ ТА ПРЯМИЙ ДОСТУП ДО ФАЙЛІВ. | ТИП POINTER.


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн