
Тема 29
Вказівник – це змінна, значенням якої є адреса пам'яті, де розташований сам динамічний об'єкт. Сам вказівник займає 4 байти. Вказівники доцільно використовувати в наступних випадках:
якщо програма працює з великими обсягами даних, загальний обсяг яких перевищує 64К;
якщо програма під час виконання опрацьовує сукупність даних, загальний обсяг яких наперед невідомий;
якщо програма використовує тимчасові буфери для зберігання даних;
якщо програма повинна трактувати ті самі дані, як дані різних типів;
якщо програма використовує зв'язані списки даних.
Опис типу вказівник. Опис типу вказівник складається символу ^, після якого стоїть ідентифікатор базового типу або зарезервоване слово pointer:
^ <базовий тип> або ^ pointer, де <базовий тип> – це ідентифікатор типу. Якщо базовий тип є ще не описаним ідентифікатором, то він повинен бути описаний в тому самому розділі опису типів, що і тип вказівник.
Вбудований тип pointer означає нетипований вказівник, тобто вказівник, який не вказує ні на який конкретний тип даних. З його допомогою зручно динамічно розташовувати дані, структура і тип яких змінюються в ході роботи програми. Значення типу pointer сумісні з усіма іншими типами вказівників.
Розіменування вказівників. Змінні типу вказівник можуть містити адреси даних певного типу або значення, яке позначається словом nil. Зарезервоване слово nil означає константу зі значенням вказівника, який ні на що не вказує (порожній вказівник). Одержання доступу до даних, на які вказують змінні вказівного типу, називають розіменуванням вказівників. Щоб розіменувати вказівник, потрібно розташувати символ " ^ " після змінної вказівного типу. З розiменованим вказівником можна працювати так само, як і зі змінною того типу, на який він вказує. Змінні типу pointer а також вказівники, що вказують на певний тип даних, але приймають значення nil, не можуть бути розіменовані: символ " ^ " після такої змінної призводить до помилки.
Присвоєння вказівникам адреси статичних змінних. Змінним вказівного типу може присвоюватися адреса оголошених в програмі змінних, які розташовані в сегменті даних. Найчастіше так чинять тоді, коли одні і ті самі дані в програмі потрібно інтерпретувати, як дані різного типу. У програмі оголошують змінну певного типу, у якій зберігатимуться ці дані і вказівник на змінну іншого типу. Адресу змінної присвоюють вказівнику, що забезпечує подвійний доступ до одних і тих самих даних і дозволяє різну їх інтерпретацію. Адреса присвоюється змінній-вказівнику операцією @:
< Ідентифікатор вказівника > : = @< Ідентифікатор змінної > .
Операція @ присвоює змінній-вказівнику адресу області пам'яті, що містить статичну змінну.
Тема 30
Оператори циклу мови програмування Pascal використовуються для організації циклів. Цикл – це послідовність операторів, які можуть виконуватися більше одного разу. Групу повторюваних операторів називають тілом циклу. У мові Pascal є три види операторів циклу: з параметром; з передумовою; з післяумовою.
Виконання оператора циклу будь-якого виду можна зупинити за допомогою оператора переходу goto або процедурою без параметрів break, що передає керування на оператор, який розташований за оператором циклу. За допомогою процедури без параметрів continue можна задати дострокове завершення чергового повторення тіла циклу, що рівносильне передачі керування в кінець тіла циклу. Оператори циклів можуть бути вкладеними один в одного.
Оператор циклу з параметром має вигляд: for i:=ip to ik do s;
де і – змінна, яку називають параметром циклу і яка є порядкового типу (цілого, символьного, логічного, інтервального або перелічуваного); iр – початкове значення параметру циклу; ik – кінцеве значення параметру циклу; ір, ik можуть бути виразами, змінними або константами. Тип параметра циклу співпадає з типом величин ір, ik; s – оператор.
Підчас виконання оператора спершу обчислюється значення виразів ір та ik, потім відбувається присвоєння значення ір параметру циклу. Після цього відбвається перевірка, чи параметр циклу є меншим або рівним ik. Якщо i £ ik, то виконується оператор s. Після цього параметр циклу збільшується на одиницю, і знову відбувається перевірка умови i £ ik. Коли i > ik, то відбувається вихід з циклу.
Існує ще одна форма цього оператора: for i:=ip downto ik do s;
Його дія аналогічна до дії попереднього оператора з тією різницею, що крок дорівнює –1, а для завершення циклу повинна виконатися умова i < ik.
Якщо в цих операторах після do стоїть два або більше операторів, то їх беруть в операторні дужки begin end. Цикл може не виконуватися жодного разу, якщо для циклу for ... to значення початкового виразу більше кінцевого, а для циклу for ... downto значення ір менше ik. Цикл буде викопуватися один раз, якщо початкове значення параметра циклу дорівнює кінцевому значенню. Параметр циклу після його завершення дорівнює кінцевому значенню. Не бажано змінювати в середині циклу параметр циклу, його початкове та кінцеве значення.
Оператор циклу з післяумовою має такий вигляд: repeat S until A;
де А – це вираз логічного типу, S – оператори. Оператори, що містяться між словами repeat і until, складають тіло циклу і виконуються доти, поки логічний вираз А не прийме значення true, тобто тіло циклу виконується при значенні логічного виразу А рівному false. Оскільки умова перевіряється наприкінці циклу, то оператори тіла циклу виконуються, як мінімум, один раз. У тілі циклу може знаходитися довільна кількість операторів без операторних дужок begin і end. Принаймні один з операторів тіла циклу повинен впливати на значення умови, у протилежному випадку відбудеться зациклення програми.
Оператор циклу з передумовою має такий формат: while A do S ;
де А – логічний вираз, S – оператор. Підчас виконання оператора спершу обчислюється значення логічного виразу А. Якщо це значення true (умова виконується), то буде виконуватися оператор S, якщо false – то відбувається вихід з циклу і виконується наступний оператор після оператора циклу. Якщо після службового do стоїть два або більше оператори, то їх беруть в операторнi дужки begin end.
Якщо перед першим виконанням циклу умова не виконується (значення логічного виразу дорівнює false), то тіло циклу взагалі не виконується і відбувається перехід на оператор, який розташований за оператором циклу.