Читайте также:
|
|
ü Линейный код СМI
ü Входной импеданс 75 Ом
ü Соответствует стандартам ITU-T Rec. G.703
SMA-4 заменой блоков легко может быть модифицирован в SMA-16 для работы на скорости 2,5 Гбит/с.
Комбинированный урок №19
Тема: Динамические структуры данных и их организация с помощью указателей
Цель: изучить принципы организации памяти, дать понятие указателю, сформировать знания о применяемых процедурах и функциях.
Динамическая память
В предшествующих разделах использовались переменные, память под которые выделялась статически, то есть на стадии компиляции. Эти области памяти (для переменных из раздела VAR данного блока) существуют до конца работы блока, даже если эти переменные уже не нужны. При этом память нередко используется неэффективно, достаточно вспомнить «настройку» массива на фактическое количество элементов, а также, если, например, объявлено несколько массивов большого объема статической памяти, а в каждый конкретный момент используются не все. Исправить положение можно, применив специальный механизм распределения памяти. Турбо Паскаль предоставляет возможность выделять и освобождать память в процессе выполнения программы, динамически.
Можно отметить следующие достоинства динамической памяти:
- экономичность и эффективность ее использования;
- возможность динамического изменения числа элементов в связанных структурах, например, списках (в статической памяти число элементов фиксировано для каждой компиляции);
- статические переменные существуют только в течение жизни блока, в котором они объявлены, а динамические - и после выхода из блока до окончания программы. Переменная, размещаемая динамически, не объявляется в разделе VAR и не имеет имени в программе («невидимка»). Компилятор не планирует выделение места в памяти под такие переменные.
Указатель
Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой). Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» четыре байта статической памяти. Обычно указатель, связанный с определенным типом данных, называется типизированным. Однако он может быть и не типизированным, то есть совместимым с указателями любого типа данных. В этом случае указатель называется свободным (несвязанным).
Формат описания типа «указатель» следующий:
TYPE <идентификатор указателя> =^ <тип>;
Примеры объявления типов «указатель» и переменных типа «указатель».
TYPE { правильные объявления типов }
P1=^WORD; {p1 - идентификатор типа «указатель» на данные типа WORD. }
P2=^CHAR; {p2 - идентификатор типа «указатель» на данные типа CHAR }
P4=ARRAY[1..10] OF ^REAL; {p4 - идентификатор типа «указатель» на массив указателей, ссылающихся на данные типа REAL }
{ неправильные объявления типов }
P5=^ARRAY[1..10] OF REAL;
P6=^STRING[25];
P7=^RECORD
FIELD1: STRING [15];
FIELD2: REAL;
END;
В формате объявления типа «указатель» должен быть указан идентификатор типа, поэтому стандартные идентификаторы (INTEGER, REAL и т.д.) можно указывать непосредственно в описаниях типа «указатель». Ошибки в описаниях типов P5, P6 и P7 будут отмечены компилятором из-за того, что, в таких случаях надо прежде описать идентификатор типа, а затем использовать его в других описаниях.
Следующие описания будут правильными:
TYPE MAS = ARRAY[1..10] OF REAL;
ST = STRING[25];
REC = RECORD
FIELD1: STRING [15];
FIELD2: REAL;
END;
VAR
P5: ^MAS;
P6: ^ST;
P7: ^REC;
Указатель может находиться в одном из трех состояний, а именно:
1) еще не инициализирован;
2) содержит адрес размещения;
3) содержит значение предопределенной константы NIL; такой указатель называется пустым, то есть не указывает ни на какую переменную. Указатель со значением NIL содержит 0 в каждом из четырех байтов. Указатели можно сравнивать с другими указателями (=, <>), присваивать им адрес или значение другого указателя, передавать как параметр. Указатель нельзя отпечатать или вывести на экран.
Обращение к выделенной динамический памяти кодируется следующим образом:
<идентификатор указателя>^.
Рассмотрим пример обращения к переменным, размещенным в динамической памяти:
TYPE SYM=^CHAR;
ZAP=RECORD
FIELD1, FIELD2: REAL;
END;
M=ARRAY[0..9] OF WORD;
VAR CH: SYM;
REC: ^ZAP;
MAS: ^M;
Begin
CH^:='*'; {обращение к динамической переменной типа CHAR, запись в эту область символа звездочка}
READLN (REC^.FIELD1); {обращение к полю FIELD1 динамической записи, ввод в него данных с клавиатуры}
WRITELN (MAS[5]^); {обращение к элементу MAS[5] динамического массива, вывод на экран значения указанного элемента}
End.
Фактически можно говорить, что CH^, REC^.FIELD1 и MAS[5]^ исполняют роль имён динамических объектов в программе, адреса которых хранятся в указателях СH, REC и MAS соответственно.Следует отметить, что обращение к переменным типа POINTER (указателям, которые не указывают ни на какой определенный тип и совместимы со всеми другими типами указателей) приводит к ошибке.
Дата добавления: 2014-12-18; просмотров: 109 | Поможем написать вашу работу | Нарушение авторских прав |