- •Конспект лекций Часть 2 Оглавление
- •Часть 2 1
- •8. Указатели
- •8.1. Указатели Понятие указателя
- •Работа с указателями
- •Арифметика указателей
- •Ошибки при работе с указателями
- •If (p1) // Если указатель не равен 0, то все в порядке
- •8.2. Указатели и массивы
- •9. Функции и структура программы
- •9.1. Создание и использование функций Процедурный подход к разработке программ
- •Int Максимум_строки (int Строка)
- •Int Минимум_строки (int Строка)
- •Int Максимум_столбца (int Столбец)
- •Int Минимум_столбца (int Столбец)
- •Определение функций в программе
- •Завершение работы функции (инструкция return)
- •If ( Ошибка )
- •Список параметров функций
- •Обращение к функциям в программе
- •Передача данных по значению
- •Передача данных с помощью указателей
- •Передача данных по ссылке
- •Перегружаемые функции
- •Параметры по умолчанию
- •Функции с переменным числом параметров
- •Рекурсивное использование функций
- •Передача функций в качестве параметров
- •Встраиваемые функции (inline - функции)
- •Прототипы функций
- •9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) Структура программы
- •Глобальные и локальные данные
- •Классы памяти
- •Многофайловые проекты
- •10. Структуры, объединения, перечисления
- •10.1. Структуры Определение структур
- •Доступ к полям структур
- •Указатели на структуры
- •Структурные параметры функций
- •Битовые поля структур
- •10.2. Объединения Обычные объединения
- •Анонимные объединения
- •10.3. Перечисления
- •Void WriteColor (тип_Спектр c )
- •11. Организация работы с файлами
- •11.1. Потоки для работы с файлами Общие сведения
- •Пример работы с файлом
- •11.2. Работа с файлами Создание потока, открытие и закрытие файла
- •Запись и чтение данных в текстовых файлах
- •Запись и чтение данных в двоичном режиме
- •If ( !File ) // Проверили удалось ли открыть файл
- •Как обнаружить конец файла?
- •Прямой доступ при работе с файлами
- •If ( !File ) // Проверили удалось ли открыть файл
- •Статус потоков ввода-вывода
- •Некоторые другие функции управления потоками ввода-вывода
- •Примеры по работе с файлами
- •12. Работа с динамической памятью Распределение памяти при работе программы
- •Динамическое выделение и освобождение памяти в стиле c
- •Возможные ошибки при работе с динамической памятью
- •Динамические массивы
- •Одномерные однонаправленные списки
- •Одномерные двунаправленные списки
- •Многомерные списки
Анонимные объединения
Имеется специальный вид объединений – анонимные объединения. Анонимные объединения объявляются без указания имени типа:
union {
short i;
char c [2];
};
Создавать переменные такого типа нельзя. Анонимные объединения позволяют обращаться к своим полям как к обычным переменным – без применения оператора “точка”. Они просто указывают на то, что переменные, соответствующие их полям, разделяют одну и ту же память.
Функция Swapс использованием анонимного объединения выглядит так:
short Swap ( short I)
{
union {
short i;
char c [2];
};
i = I;
char ch = c [0];
c [0] = c [1];
c [1] = ch;
return i;
}
10.3. Перечисления
Перечисления(enumeration) служат для определения пользовательских типов данных, значения которых принадлежат одному из элементов в некотором списке именованных целочисленных констант. Перечисление задается ключевым словомenum:
enum тип_Спектр {
красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый
} Цвет1, Цвет2;
Новый пользовательский тип данных тип_Спектропределяет список именованных целочисленных констант (этот список находится внутри фигурных скобок {}). Значениями переменныхЦвет1 и Цвет2могут быть только те значения, имена которых перечислены в определении этого типа данных. Переменной этого типа может быть присвоено любое из перечисленных имен:
Цвет1 = желтый;
Цвет2 = синий;
Каждое имя в списке представляет собой некоторое целое значение. По умолчанию целые значения констант перечисления начинаются с 0 и последовательно увеличиваются на единицу:
for ( Цвет1 = красный; Цвет1 <= фиолетовый; Цвет1 = тип_Спектр( Цвет1 + 1 ) )
cout << Цвет1 << endl;
Этот фрагмент программы выведет на экран целые значения от 0 до 6.
При вводе-выводе значений этих типов данных используются именно числовые значения констант, а не их имена. Если необходимо вывести значение перечисления в виде его имени, а не числового значения, необходимо реализовать это программно, например, написав функцию (вывод данных):
Void WriteColor (тип_Спектр c )
{
switch (C)
{
case красный: cout << "красный"; break;
case оранжевый: cout << "оранжевый"; break;
case желтый: cout << "желтый"; break;
case зеленый: cout << "зеленый"; break;
case голубой: cout << "голубой"; break;
case синий: cout << "синий"; break;
case фиолетовый: cout << "фиолетовый"; break;
default: cout << "Неправильный цвет\n";
}
}
Числовые значения констант перечисления можно изменять, например, так:
enum тип_Спектр {
красный, оранжевый, желтый = 10, зеленый, голубой, синий, фиолетовый
};
После такого переопределения числового значения константы желтый, числовые значения всех констант будут следующими:
красный |
оранжевый |
желтый |
зеленый |
голубой |
синий |
фиолетовый |
0 |
1 |
10 |
11 |
12 |
13 |
14 |
Перечисления обычно используются для того, чтобы сделать тексты программ более понятными, и как следствие, избавиться от дополнительных возможных ошибок.