Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прога.doc
Скачиваний:
60
Добавлен:
21.02.2016
Размер:
207.36 Кб
Скачать

9. Структуры данных. Адреса и указатели.

Указатель — это переменная, которая может содержать адрес другой переменной. Указатель может быть использован для работы с переменной, адрес которой он содержит. Использование указателей позволяет реализовать более эффективную обработку массивов, структур, а также реализовывать подпрограммы, которые будут работать над различными областями памяти микроконтроллера. Для этого в подпрограмму нужно только передать начальный адрес обрабатываемой области памяти. Для инициализации указателя (записи начального адреса переменной) можно использовать идентификатор переменной, при этом в качестве идентификатора может выступать имя переменной, массива, структуры, литеральной строки.

тип_переменной *имя_переменной_адреса;

Например

Type   A = Array[1..100] of integer; Тип указателя на такой объект: Type   tA = ^A;

Операции с указателями

     Для указателей допустимы операции сравнения и присваивания.

Присваивание. Указателю можно присвоить содержимое другого указателя того же самого типа или константу NIL – пустой, или адрес объекта с помощью функции ADDR или оператора @. Пример: P1 := PP; P2 := NIL; P3 := Addr(X); P4 := @X;

 Работа с динамической памятью.В Паскале имеется стандартная процедура, позволяющая освобождать память от данных, потребность в которых отпала. Ее формат:

DISPOSE(<указатель>);

Procedure FreeMem(var P: Pointer [; Size: Integer]);

Освобождает память, выделенную динамической переменной данного размера.

Procedure GetMem(var P: Pointer; Size: Integer);

GetMem создает динамическую переменную определенного размера и помещает адрес блока в переменную Р.

Procedure New(var P: Pointer);

Создает новую динамическую переменную и помещает ее адрес в переменную Р. P - переменная любого типа-указателя. Размер распределенного блока памяти равен размеру типа, на который указывает P. Если памяти недостаточно, чтобы распределить динамическую переменную, возникает исключительная ситуация EOutOfMemory.

Функция ADDR(X)- результат типа POINTER, содержащий адрес аргумента X.

Функция CSEG - возвращает значение, хранящееся в сегментном регистре кода программы CS. Результат: тип Word.

DSEG- возвращаег значение, хранящееся в сегментном регистре данных программы DS. Результат: тип Word.

Функция MAXAVAIL - возвращает размер в байтах наибольшего непрерывного участка кучи. Результат : тип Longint.

Функция MEMAVAIL - возвращает размер в байтах общего свободного пространства кучи. Результат : тип Longint.

Процедура NEW(P), где Р- типизированный указатель.Резервирует фрагмент кучи для размещения переменной.

Функция OFS(X) - возвращает значение типа WORD - смещение адреса указанного объекта X (X — выражение любого типа или имя процедуры).

Функция SEG(X) - возвращает значение типа WORD, содержащее сегмент адреса указанного объекта X (Х- выражение любого типа или имя процедуры).

Функция PTR(SEG, OFS) возвращает значение типа POINTER по заданному сегменту SEG и смещению OFS.

Процедура М ARK(P) - запоминает текущее значение указателя кучи HEAPPTR и присваивает это значение указателю Р. Здесь Р- указатель любого типа.

Процедура RELEASE(P) - освобождает участок кучи начиная от адреса, хранящегося в Р и до конца кучи. Одновременно уничтожается список всех свободных фрагментов, которые, возможно, были созданы процедурами DISPOSE и FREEMEM, начиная от адреса, хранящегося в Р и до конца кучи