- •Содержание
- •1 Списковые структуры и динамическая память 10
- •2 Списковые структуры и файлы 79
- •3 Мультисписковые структуры 121
- •4 Указатели на функции 134
- •5 Совместное использование указателей на данные и указателей на функции 141
- •6 Оформление курсового проекта 157
- •1.1Представления однонаправленных списков массивами указателей на элементы списка
- •1.1.1Представление однонаправленных списков массивами указателей
- •Введение
- •1Списковые структуры и динамическая память
- •1.1.2Статические массивы указателей
- •1.1.3Операции со списками в статических массивах указателей
- •1.1.4Статические массивы указателей в динамической памяти
- •1.1.5Операции со списками в статических массивах указателей в динамической памяти
- •1.1.6Динамические массивы указателей
- •1.1.7Динамические массивы типизированных указателей
- •1.1.8Операции со списками в динамических массивах типизированных указателей
- •1.1.9Динамические массивы нетипизированных указателей
- •1.1.10Операции со списками в динамических массивах нетипизированных указателей
- •1.1.11Продолжение. Динамические массивы нетипизированных указателей
- •1.1.12Замечания по оператору &
- •1.1.13Нетипизированые указатели и массивы
- •1.1.14Нетипизированые указатели и память
- •1.1.15Продолжение. Динамические массивы нетипизированных указателей
- •2Списковые структуры и файлы
- •2.1Бестиповые файлы и однонаправленные списки на базе массивов указателей на элементы списка
- •2.1.1Представление однонаправленных списков массивами указателей
- •2.1.2Организация файла с однонаправленным списком на базе массивов указателей на элементы списка
- •2.1.3Статические и динамические массивы указателей
- •2.1.4Организация списка дыр
- •2.1.5Функция инициализации файла со списком
- •2.1.6Функция открытия файла со списком
- •2.1.7Функции корректировки указателя на начало списка, заголовка списка дыр, количества элементов списка и текщего размера массива указателей
- •2.1.8Функция выделения записи для нового элемента списка
- •2.1.9Функция освобождения записи удаляемого элемента списка
- •2.1.10 Функция увеличения размера массива указателей на элементы списка
- •2.1.11 Функция вывода содержимого списка
- •2.1.12 Функция поиска элемента списка
- •2.1.13Функция добавления элемента в неотсортированный список
- •2.1.14Функция добавления элемента в отсортированный список
- •2.1.15Функция удаления элемента из отсортированного списка
- •2.1.16Функция удаления списка
- •2.1.17 Функция удаления списка с усечением файла
- •2.1.18 Пример программы обработки отсортированного списка на базе массивов указателей
- •2.1.19Продолжение. Представление однонаправленных списков массивами указателей
- •2.1.20Функция инициализации файла со списком
- •2.1.21Процедура открытия файла со списком
- •2.1.22Процедура корректировки заголовка списка
- •2.1.23 Процедура увеличения размера массива указателей на элементы списка
- •2.1.24Функция поиска элемента списка или позиции вставки нового элемента методом половинного деления
- •2.1.25Функция вывода списка на экран
- •2.1.26Функция добавления нового элемента в отсортированный список
- •2.1.27Функция удаления элемента из отсортированного списка
- •2.1.28Функция удаления списка с усечением файла
- •3Мультисписковые структуры
- •3.1Назначение мультисписков
- •3.2Мультисписки в динамической памяти
- •3.3Мультисписки в бинарных файлах
- •3.4Сохранение и восстановление мультисписка в динамической памяти
- •4Указатели на функции
- •4.1Понятие указателя на функцию и его объявление
- •4.2Переменная-указатель на функцию как параметр другой функции
- •4.3Условия использования указателей на функции
- •4.4Использование указателей на функцию для вызова функций
- •4.4.1Формат переменных-указателей на функцию и бестиповых указателей
- •4.4.2Преобразование переменной-указателя на функцию к бестиповому указателю на функцию
- •4.4.3Вызов функции через бестиповый указатель на функцию
- •4.4.4Преобразование бестипового указателя к переменной типа указатель на функцию
- •4.5Способы вызова функции через указатель на функцию
- •4.5.1Массивы указателей на функции
- •5Совместное использование указателей на данные и указателей на функции
- •5.1Инвариантные функци
- •5.2Функции сравнения
- •5.3Пример 1
- •5.4Пример 2
- •6Оформление курсового проекта
- •6.1Интерфейс программной системы
- •6.2Взаимодействие с мультисписком
- •6.3Отображение содержимого мультисписка
- •6.4Файл справки
- •6.5Документация по курсовому проекту
- •6.5.1Общие положения
- •6.5.2Курсовой проект/работа
- •6.5.3Пояснительная записка
- •6.5.4Техническое задание
- •6.5.5Реферат
- •6.5.6Содержание
- •6.5.7Введение
- •6.5.8 Постановка задачи
- •6.5.9 Анализ решаемой задачи
- •6.5.10Анализ существующих методов организации динамических структур данных
- •6.5.11 Определение путей и методов решения задачи
- •6.5.12Проектирование программы
- •6.5.13Заключение
- •6.5.14Список использованных источников
- •6.6Приложения
4Указатели на функции
4.1Понятие указателя на функцию и его объявление
Функция не является переменной, но так же располагается в памяти компьютера. Имя функции является указателем на саму функцию. Адрес функции можно присвоить переменной-указателю на функцию, а затем вызывать эту функцию при помощи переменной-указателя. Адрес функции считается ее точкой входа и используется при вызове.
Указатель на функцию явлется средством передачи функций в качестве фактических параметров других функций.
Для объявления указателя на функцию используется заголовок функции, в котором вместо имени функции в круглых скобках пишется оператор * и имя указателя на функцию, например,
для функции добавления элемента в список, имеющей такой заголовок
void AddElSortList (void* &PtrArrPtr, void* NewP, int PosAddEl),
объявление указателя на такую функцию будет иметь вид:
void (*add_f)(void* &PtrArrPtr, void* NewP, int PosAddEl);
или
void (*add_f)(void* & , void*, int).
В данном примере создается указатель add_f на функцию, которая возвращает значение типа void и получает три параметра.
Круглые скобки вокруг (*add_f) обязательны, так как объявление без скобок будет иметь совершенно другой смысл. Такая строка
void *add_f(void* &, void*, int)
будет означать, что объявляется функция add_f, которая получает три параметра и возвращает нетипизированный указатель void*.
Таким образом, в объявлении указателя на функцию всегда содержится тип возвращаемой переменной и список формальных параметров, если такие имеются.
Конструкция
void (*add_f)(void* &, void*, int )
достаточно громоздкая. Поэтому удобнее, используя typedef, объявить тип для указателя на функцию, а затем использовать его в программе:
typedef
void (*Tptr_f)(void* & , void*, int);
Теперь объявление указателя на функцию будет иметь более простой вид:
Tptr_f add_func;
Простейшим случаем использования переменных-указателей на функции является создание синонимов (алиасов) имен существующих функций. Это позволяет обращаться к уже существующим функциям с помощью других имен.
Чтобы связать указатель на функцию с конкретной функцией, необходимо указателю присвоить имя этой функции без каких либо скобок и параметров. Указатель на функцию используется так же как ее имя.
add_func = AddElSortList; // Формирование синонима (алиаса) имени функции
Обращение к функции через указатель записывается так же, как обычный вызов функции, только вместо ее имени пишется имя указателя, а затем список параметров в скобках:
add_func (PtrDynArrPtr, NPtrElm, PosAdd); /* Вызов функции добавления но-
вого элемента в список через синоним (алиас)*/
или так:
(*add_func)(PtrDynArrPtr, NPtrElm, PosAdd); /* Вызов функции добавления
нового элемента в список через указатель*/
Первый вариант вызова функции короче, но второй вариант явно показывает, что функция вызывается через указатель.
В последующих разделах приводятся подробные иллюстрации использования переменных и параметров указателей на функции.
4.2Переменная-указатель на функцию как параметр другой функции
Для иллюстрации использования функции как параметра другой функции введем функцию – AсtionWithNumbers, которая получает два числа типа int и выполняет с ними определенное арифметическое действие, результат которого возвращает. Эта функция в качестве формального параметра использует параметр – указатель на функцию, в которой и происходит выполнение арифметической операции.
Функция AсtionWithNumbers имеет следующий вид:
int AсtionWithNumbers (int a, int b, int (*Func_Arifm) (int, int))
{
int rez ;
rez = Func_Arifm (a, b); /*вызов функции, переданной в качестве параметра*/
return rez;
} /* AсtionWithNumbers */
Функция APlusB имеет следующий вид:
int APlusB (int a, int b)
{
return a+b;
}
Ниже приводятся основные способы вызова функции APlusB, которая выполняет сложение двух чисел:
Прямой вызов функции.
int n = APlusB (n1, n2);
Фактическим параметром функции AсtionWithNumbers служит имя функции APlusB:
int n = AсtionWithNumbers (n1, n2, APlusB);
Заголовок функции выглядит достаточно громоздко. Программу можно упростить, если заранее объявить тип для указателя на функцию таким образом:
typedef
int (*TPFunc) (int, int); /*TPFunc – тип указателя на функцию*/
Теперь используем заранее объявленный тип для указателя на функцию в объявлении параметров функции.
int AсtionWithNumbers (int a, int b, TPFunc Func_Arifm )
{
int rez ;
rez = Func_Arifm (a, b); /*вызов функции, переданной в качестве параметра*/
return rez;
} /* AсtionWithNumbers */
Функция APlusB имеет следующий вид:
int APlusB (int a, int b)
{
return a+b;
}
Вызов функции APlusB, которая является аргументом функции AсtionWithNumbers:
int n = AсtionWithNumbers (n1, n2, APlusB);
