Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

30.5. Функции для работы с блоками памяти

Данные функции упрощают работу с блоками информации в памяти. Блок – это подряд расположенные байты оперативной памяти. Функции используют наиболее эффективные машинные команды – так называемые цепочечные примитивы. Поэтому эти функции очень быстро работают с большими блоками памяти. Все функции используют указатель на начало блока памяти как параметр. Функции для блоков похожи на функции для строк. Отличие – функции для строк концом блока информации считают ‘\0’, а эти функции всегда ориентируются явно на длину блока. При работе с этими функциями надо аккуратно резервировать память под буфер-назначение.

Прототипы функций для работы с блоками памяти содержатся в заголовочном файле <mem.h>, а также в <string.h>.

Рассмотрим основные функции (подробно все можно найти в Касаткине).

Копирование блоков:

void *memcpy(void *d, void *s, unsigned int n);

Копируется n байт из блока, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Блоки не должны пересекаться в памяти. Функция возвращает адрес блока-назначения.

Копирование блоков с условием:

void *memccpy(void *d, void *s, int c, unsigned int n);

Копируется блок, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Копирование продолжается до тех пор, пока не произойдет одно из двух событий: функция встретит в блоке-источнике байт, содержащий символ c, который тоже перенесется в блок-назначение; или общее число скопированных байтов достигнет значения n. Если происходит первое событие, функция возвращает указатель на следующий после символа c байт в блоке-назначении, иначе возвращает NULL.

Пересылка блоков:

void *memmove(void *d, void *s, unsigned int n);

Копируется n байт из блока, на начало которого указывает s, в другое место памяти, на начало которого указывает d. Блоки могут пересекаться в памяти. Функция возвращает адрес блока-назначения.

Сравнение двух блоков:

int memcmp(void *s1, void *s2, unsigned int n);

Сравнивает n первых байтов двух блоков, на начало которых указывают s1 и s2. Функция возвращает значение больше нуля, если s1 > s2, меньше нуля, если s1 < s2, и равное нулю, если s1 == s2.

Занесение символа n раз в буфер:

void *memset(void *s, int c, unsigned int n);

Устанавливает n байтов буфера, на начало которого указывает s, в заданное значение c. Функция возвращает указатель на блок s.

Поиск символа в блоке:

void *memchr(void *s, int c, unsigned int n);

Просматривается n байтов блока, на начало которого указывает s, сопоставляя каждый байт с кодом символа c. Если совпадение найдено, функция возвращает указатель на этот байт с символом c в буфере, иначе возвращает NULL.

31. Динамические структуры данных

31.1. Понятие структуры данных

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

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

Структуры данных могут быть статическими и динамическими. Ранее мы рассматривали структуры данных фиксированного размера: одномерные и двумерные массивы, структуры. Основное отличие динамических структур от статических заключается в возможности менять в ходе работы количество содержащихся в структуре данных элементов.