Автоматизация Автоматизация Архитектура Астрономия Одит Биология Счетоводство Военна наука Генетика География Геология Държавна къща Друга журналистика и средства за масова информация Изкуство Чужди езици Компютърни науки История Компютри Компютри Кулинарна култура Лексикология Литература Логика Маркетинг Математика Механика Механика Мениджмънт Метал и заваръчна механика Музика Население Образование Безопасност на живота Охрана на труда Педагогика Политика Право инструмент за програмиране производство Industries Психология P Дио Религия Източници Communication Социология на спорта стандартизация Строителство Технологии Търговия Туризъм Физика Физиология Философия Финанси Химически съоръжения Tsennoobrazovanie скициране Екология иконометрия Икономика Електроника Yurispundenktsiya

указатели

Прочетете още:
  1. VI. Знаци и знаци за транспорта
  2. Въпрос 50. Каква е употребата на индикаторите за светлина от маршрута?
  3. Светлинните индикации запазват стойностите на сигнала в състояние на гасене.
  4. БЕЗПЛАТНО МАСИВНИ И ПОКАЗАТЕЛИ
  5. указатели
  6. указатели
  7. ИНДИКАТОРИ И МАСИВНИ
  8. ИНДИКАТОРИ И МНОГОМЕРНИ МАСИВИ
  9. Функционални указатели
  10. Индикатори на напрежението
  11. Индикатори за ниво на водата

Лабораторни упражнения № 5

Досега сме се срещнали с променливи, за всяка от които бе присвоена клетка с памет, която е била непроменена по време на изпълнението на програмата. Такива променливи N. Wirth наричаха статични. За да се управлява по-ефективно паметта, са разработени динамични променливи и указатели (референции). Използването на указатели и динамични променливи позволява създаването на гъвкави изчислителни структури и значително разширява използваната памет.

Динамичната променлива не е изрично посочена в описанията на променливите и няма име. За достъп до динамични променливи се наричат ​​променливи със специален тип данни, наречени указатели (или препратки).

Показалецът е променлива, чиято стойност е адресът на динамичната променлива. Името на указателя се съставя в съответствие с общите правила за идентификация, приети в Делфи. Ако указател е свързан с динамична променлива от определен тип, той се нарича натиснат . За да опишете написания показалец, използвайте символа ^, който е поставен пред съответния тип на динамичната променлива. Обикновено, динамичните променливи имат тип запис , тъй като те трябва да съдържат освен стойността (числова или текстова) указатели към други динамични променливи на съответната структура. В операторската част на програмата динамичните променливи се обозначават с името на показалеца с символа ^ след името. Описанието на показалеца обикновено е в следната форма:

тип <указател тип> = ^ <тип динамична променлива>;

<вид динамична променлива> = запис

<име на поле на данни>: <тип данни>;

, , , , , , , , , , ,

<име на полето на показалеца>: <вид указател>:

, , , , , , , , , , ,

приключи;

var <име на показалеца>: <вид на показалеца>;

<име на показалеца>: ^ <тип динамична променлива>;

Например:

тип pn = ^ dp;

dp = запис

i: цяло число;

p: pn

приключи;

var p1: ^ цяло число;

p2: ^ реално;

p3: pn;

Горното описание предполага използването на показалеца р1, съдържащ адреса на динамичната променлива от типа цяло число, показалеца р2, сочещ към променливата на действителния тип, и показалеца рЗ, показващ променливата на типа на записа. В операторската част на програмата, съответните променливи ще бъдат обозначени като p1 ^, p2 ^ и p3 ^.



В Делфи можете да декларирате указател и да не го свързвате с конкретен тип данни. За целта използвайте стандартен тип указател, например:

var p: указател;

Показателите от този вид се наричат нетипирани . Тъй като указателите, които не са напечатани, не са свързани с конкретен тип, те ви помагат да поставяте динамично данни, чиято структура и тип се променят по време на работа на програмата.

На показалеца може да бъде зададена "празна" адресна стойност, обозначена със служебната дума нула. Оператор на задача p1: = нула; означава, че показалец p1 не се отнася до никаква динамична променлива.

За да се създадат динамични променливи, се планира процедурата нова (r), където r е написаният показалец. В резултат на тази процедура клетката, съответстваща на описанието на динамичната променлива, се разпределя в свободна памет (обозначена с термина "купчина"), а адреса на избраното място в паметта се записва в стойността на показалеца. След това необходимите стойности могат да бъдат въведени в полетата на динамичната променлива.

За да се "изтрият" динамичните променливи, се използва процедурата за разпореждане (r), в резултат на което показалецът придобива стойност нула и областта на паметта се изчиства (разпределената клетка на паметта се връща в "купчината").

Връзките между елементите в повече или по-малко сложни изчислителни структури обикновено са илюстрирани с диаграми. Всеки обект се представя с правоъгълник, разделен на части, съответстващи на полетата за запис. До него е показана променлива. Връзките са представени със стрелки. Стойностите на данните се записват в частта от правоъгълниците, разпределени в полетата за данни.

Първо, нека разгледаме графичното представяне на елементарните операции. Описанието на указателите и динамичните променливи (тук и по-долу) е както следва:

тип pn = ^ dp;

dp = запис

i: цяло число;

p: pn

приключи;

var k, j, n: цяло число;

‡ Зареждане ...

q, r, s: пп;

Да предположим, че две вериги от динамични променливи вече са съхранени в паметта на машината: r ^ r ^ .p ^

r 15 25

q 20 30

q ^ q ^ .p ^

а) След изявление на оператора q: = r; указателят q се отнася до същата променлива като r.

r 15 25

r ^

qq ^

b) След оператора q ^: = r ^; (от началното състояние) променлива със стойност 15 се изпраща на мястото на променливата със стойност 20, отнасяща се до променливата със стойност 25.

r 15 25

q 15

в) След оператора q ^ .i: = r ^ .i; (от началното състояние), стойността 15 се изпраща на мястото на цялата стойност 20 и полето на показалеца не се променя.


r 15 25

q 15 30

d) След изпълнението на оператора q ^ .p: = r ^ .p (от началното състояние) се препраща към променливата със стойност 25, изпратена на мястото на препратката към променливата със стойност 30 и полето на цялата стойност не се променя.

r 15 25

р 20

Показателите могат да бъдат сравнявани чрез операции = и <>. Логическият израз q = r е вярно в случай а), а в случаи b) и c) - невярно, тъй като в тези случаи указателите .q и r сочат към различни динамични променливи, които обаче имат еднакви стойности.

Нека конструираме списък от три елемента, съдържащи числа 5, 12 и 8. Стойността на показалеца r в процеса на изграждане винаги ще бъде препратка към първия елемент на вече изградената част от списъка. Показалец q ще бъде използван за разпределяне на ново място в паметта с помощта на ново, за да се поставят нови елементи от списъка. Изпълнение на оператора r: = нула; води до създаването на празен списък. След изпълнение на изявленията:

нова (q); q ^ .i: = 8; q ^ .p: = r; r: = q;

получават списък, състоящ се от един елемент, съдържащ номер 8 в частта от данни. Позоваването на този елемент е стойността на указателите r и q.


r 8 нула

r ^, q ^

р

Изпълнение на новия (q); q ^ .i: = 12; q ^ .p: = r; r: = q; води до факта, че в началото на този списък се добавя нов елемент, съдържащ числото 12.


r 12 8 нула

R ^ R ^ .p ^

qq ^ q ^ .p ^

След изпълнението на операторите нов (q); q ^ .i: = 5; q ^ .p: = r; r: = q; Добавянето на елемент, съдържащ номер 5 в началото на списъка, завършва списъка.

r 5 12 8 нула

R ^ R ^ р ^ R ^ .p ^ .p ^

qq ^ q ^ p ^ q ^ .p ^ .p ^

Стойността на указателите r и q е препратка към първия елемент на списъка. Нулевата стойност на полето p на елемента, съдържащ числото 8, е знак, че този елемент е последният в списъка. Стойността на променливата r ^ .p ^ .i. е цяло число 12; стойност r ^ .p ^ .p - позоваване на третия елемент от списъка.

Замисленият начин за създаване на списък е да се създаде празен списък и в повтарящото се изпълнение на редица същите стъпки, като се добавят нови елементи към началото на конструкцията на списъка. Това означава, че като цяло можете да използвате оператор на линия, за да създадете списък.

Ако стойността на показалеца q е адресът на някой елемент от списъка, операторът q: = q ^ .p; дава адреса на следващия елемент или нула. Използвайки този метод на преход от един елемент към друг, можете да видите целия списък или част от него.

За да включите нов елемент в съществуващия списък, трябва първо да зададете елемента на списъка с показалеца q, след което да се постави новият елемент и след това да изпълните последователността на новите оператори; s ^ .i: = j; s ^ .p: = q ^ .p; q ^ .p: = s; Тук s е допълнителен указател, j е стойността на новия елемент.

За да изключим от списъка елемент, следващ този, посочен от показалеца q, е необходимо да се изпълни поредица оператори s: = q ^ p; q ^ .p: = q ^ .p ^ .p; s ^ .p: = нула;


| 1 | 2 |


Когато използвате този материал, свържете се със bseen2.biz (0.053 сек.)