Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уровни описания структур данных.docx
Скачиваний:
10
Добавлен:
22.09.2019
Размер:
62.72 Кб
Скачать
  1. Ссылочный тип данных

Ссылочный тип данных предназначен для обеспечения возможности указания на другие данные. Указатели характерны для языков процедурного типа, в которых есть понятие области памяти для хранения данных. Ссылочный тип данных предназначен для обработки сложных изменяющихся структур, например деревьев, графов, рекурсивных структур.

Принято не именовать, а обозначать динамический объект посредством ссылки на него. Ссылка занимает одно машинное слово, что совсем не много в сравнении с возможным размером динамического объекта. Ссылка (указатель) это такой же простой скалярный тип данных, как и целый, вещественный, логический и тп, имеющий аппаратную поддержку. Элементами множества значений этого типа являются конкретные ссылки на объекты, созданные в основной памяти в процессе выполнения программы. В языке си ссылка на какой либо тип данный обозначается звездочкой и называется указателем. Ссылочные типы – это множества значений указывающих на объекты конкретных типов. Разные указуемые типы порождают разные ссылочные типы, множества значений которых не пересекаются. Однако пустое ссылочное значение одинаково во всех ссылочных типах. В си оно обозначается константой NULL, либо просто нулем и означает что указатель не указывает никуда, т.е. не существует связи этого указателя с конкретным динамическим объектом.

Ссылочный тип может быть именованным и неименованным. Множество значений именованного ссылочного типа включает адреса в памяти для размещения объектов указуемого типа. При помощи именнованного типа можно создавать переменные ссылочного типа указывая их тип как имя ссылочного типа.

Использование именованного ссылочного типа в Си:

typedef T* pointer;

pointer P;

Неименованного типа:

T* P1;

В си P1 и P будут совместимыми, а в паскале нет.

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

Для переменных одного и того же типа определены операции присваивания и разыменования и отношение равенства. Операция разыменования обеспечивает доступ к значению обозначаемого ссылкой объекта и имеет аппаратную поддержку (косвенная адресация). Динамические объекты порождаются при выполнении встроенных процедур (new в паскале malloc в си) возвращаемым значением которой является адрес взятый из «кучи» - области основной памяти машины, зарезервированной для этой цели. В языках без сборщика мусора важно также вовремя освобождать память неиспользуемых динамических объектов. В языке Си это можно сделать при помощи процедуры free. Ссылочный тип является внутремашинным и его значения не могут быть выведены и введены стандартными процедурами печати и чтения. Однако в си ссылочный тип хорошо согласован с целым, поэтому ввод и вывод может быть осуществлен при помощи функций scanf printf (шаблон %p).

  1. Файл. Функциональная спецификация.

Для задания функциональной спецификации файлового типа необходимо указать множество значений, множество изображений изображений данного типа, правила интерпретации изображений и определить базовое множество атрибутов этого типа(операции, отношения и тп)

Значениями файлового типа являются сколь угодно длинные, но конечные последовательности компонент T. Такое бесконечное множество значений можно определить формально с помощью операции конкатенации двух файлов (||), состоящих из компонент одного и того же типа. Можество значений порождаются следующими правилами:

  1. {} есть файл типа F(пустой файл)

  2. Если элемент t и файл есть файл этого типа элементов, то F||{t} есть файл того же типа.

  3. Никакие другие значения не являются файлами этого типа.

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

Базовое множество атрибутов файлового типа:

  1. Операция конкатенации

  2. Операция присваивания, определяемая как покомпонентное копирование одного файла в другой, с сохранением порядка и количества компонент.

  3. Отношение равенства: два файла равны тогда и только тогда, когда файлы имеют одинаковую длину и состоят из одинакового количества компонент соответственно одинаковых значений.

  4. Функции: создания(порождение пустого файла), доступ (последовательный доступ к каждой компоненте, причем только для чтения), модификация(добавление новой компоненты того же типа в конец файла – фактически конкатенация файла и новой компоненты), уничтожение(стирание) файла.

  1. Файл. Логическое описание. Физическое представление.

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

Для описания файла в Си необходимо объявить переменную предопределённого типа FILE*. Созданный компилятором виртуальный файловый дескриптор может быть динамически связан с конкретным файлом, потоком или устройством с помощью функций из стандартной библиотеки Си. В Си отсутствует файловый тип как таковой, однако в библиотеке существуют определения файловый дескрипторов и функций для работы с ними. Вместо описания файловой переменной в Си необходимо определить переменную-дескриптор файла, которая является ссылкой на файл. Далее Си позволяет сопоставить этому дескриптору существующий либо создаваемый файл, установить режимы доступа (чтение, запись, перезапись), задать формат и типизацию данных файла. Создание дескриптора к файлу осуществляется при помощи функции fopen(file,”r/w/a/…”), также для файла существуют операции записи и считывания, аналогичные функциям записи и считывания с входного/выходного потока. По сути функции scanf() и printf() являются макросами от функций fscanf(stdin, …) и fprintf(stdout,…). Они же, в свою очередь реализуются через более низкоуровневые функции считывания символа getc(file*) putc(file*, var). Также присутствует функция проверки конца файла (feof(file*)) и функция закрытия файла (fclose(file*)). Функций копирования и конкатенации файлов в си и паскале нет, так что их необходимо реализовывать программисту вручную.