- •Содержание
- •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Приложения
1.1.12Замечания по оператору &
Оператор & языка C++ позволяет получить месторасположение в памяти программы любой переменной.
Следует подчеркнуть, что оператор & позволяет получить адрес любой правильно квалифицированной переменной - скалярной, структуры или поля структуры, массива или элемента массива и т.д. Этот адрес указывает на 1-ый байт области памяти, отведенной под переменную конкретного типа.
Следует также подчеркнуть, что полученный таким образом адрес является бестиповым указателем и его можно использовать в качестве значения переменной типа void* - нетипизированный указатель. Следовательно, для правильной работы с переменной требуемого типа, указатель на которую получен, необходимо выполнить приведение нетипизированного указателя к конкретному типу.
Пусть имеются следующие объявления:
void* Ptr;
TElemList ElmLst;
TElemList * PtrList; /*типизированный указатель на элемент списка*/
TElemList ArrElmLst[10];
void* NPtrAr; /*нетипизированный указатель для работы с элемен
том записи или массива*/
int J;
int P;
char * S;
Тогда можно выполнить следующие действия:
Ptr = &ElmLst.Age; /*взятие адреса поля Age записи ElmLst*/
*((int*)Ptr) = 54; /*заполнение поля записи - аналог ElmLst.Age=54 */
J= *((int*)Ptr); /*чтение поля записи*/
textBox1->Text = (*((int*)Ptr)).ToString(); /*вывод поля Age записи - аналог
textBox1->Text=J.ToString();*/
Ptr = &ElmLst.Name; /*взятие адреса поля Name записи ElmLst*/
S = (char*)Ptr; /*S указывает на строку в поле Name записи*/
textBox1->Text = __gc new String(S); /*перевод С-строки в строку System::
String и вывод поля Name записи*/
P = (int)Ptr; /*Значение Ptr преобразовываем в значение типа int*/
/* Вывод значения Ptr на экран*/
textBox1->Text = System::String::Concat(S"Значение указателя = ", Convert::
ToString(P));
Ptr = &ArrElmLst[2]; /*взятие адреса элемента массива*/
/*заполнение поля записи эле-мента массива - аналог (ArrElmLst[2].Age=) */
((TElmList*)Ptr)->Age = Convert::ToInt32(textBox1->Text);
J = ((TElmList*)Ptr)->Age; /*чтение поля записи элемента массива*/
/*вывод поля записи элемента массива - аналог textBox2->Text = Convert:: ToString(J)*/
textBox2->Text=Convert::ToString(((TElmList*)Ptr)->Age);
Ptr = &ArrElmLst[2].Age; /*взятие адреса поля записи элемента массива*/
J = *((int*)Ptr); /*чтение поля записи элемента массива*/
/*вывод поля записи элемента массива - аналог textBox2->Text = Convert::ToString(J)*/
textBox2->Text=Convert::ToString(*((int*)Ptr));
Аналогичные действия можно проделать и с динамическими переменными, память для которых выделяется с помощью операторов new и delete.
Пусть оператором new память выделяется для записи.
PtrList = new TElmList;
Тогда возможно:
Ptr = &PtrList->Age;
*((int*)Ptr)= Convert::ToInt32(textBox1->Text); /*ввод поля Age записи – аналог PtrList->Age = Convert::ToInt32(textBox1->Text);*/
Пусть теперь оператором new память выделяется для массива
void* NPtrAr = new TElmList [20];
Тогда получить адрес поля Age второго элемента массива можно так:
Ptr = &((((TElmList*)NPtrAr)[2]).Age);
Ввод значения в поле Age второго элемента массива:
*((int*)Ptr) = Convert::ToInt32(textBox1->Text);
/* аналог ((((TElmList*)NPtrAr)[2]).Age) = Convert::ToInt32(textBox1->Text); */
Рассмотренные возможности могут быть использованы для повышения гибкости процедур обработки данных, в частности, функций сравнения однотипных полей разнотипных данных.
