- •1. Классификация и обзор языков программирования.
- •2. Основные синтаксические конструкции языков программирования. Типы данных.
- •3. Логический тип. Реализация ветвлений в языках программирования.
- •Программирование вложенных ветвлений
- •4. Реализация циклов в языках программирования. Цикл while - цикл с предусловием
- •Цикл repeat - цикл с постусловием
- •5. Реализация вспомогательных алгоритмов в языках программирования.
- •6. Обработка символьных и строковых величин в языках программирования.
- •Процедуры преобразования типов
- •7. Структурированные типы данных. Массивы.
- •8. Структурированные типы данных. Записи.
- •9. Структуры данных. Адреса и указатели.
- •Операции с указателями
- •10. Работа с файлами. Типизированные и текстовые файлы.
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, начиная от адреса, хранящегося в Р и до конца кучи