- •Конспект лекций Часть 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
- •Возможные ошибки при работе с динамической памятью
- •Динамические массивы
- •Одномерные однонаправленные списки
- •Одномерные двунаправленные списки
- •Многомерные списки
Прототипы функций
Прототипом функции называется заголовок функции (со списком параметров), заканчивающийся символом ;. Например:
double F (int P1, double P2 );// Это прототип функцииF
double F (int P1, double P2 ) // А это сама функция F
{
return P1 * P2;
}
В прототипе функции допускается не указывать имена параметров (типы параметров должны быть указаны обязательно). Например, прототип той же функции можно записать так:
double F (int, double);// И это прототип функцииF
Назначение прототипов – это опережающее описание функции, определяющее правила вызова функции.
Обычно прототипы функций используются в заголовочных файлах.
Использование прототипов необязательно, если все функции определены в одном файле, и порядок их описания в тексте таков, что описание каждой функции опережает ее вызов. Однако не всегда можно описать функцию до ее использования. В этом случае использование прототипа становится обязательным:
void A ()
{
……
B ();
……
}
void B ()
{
……
A ();
……
}
Это пример, так называемого, “перекрестного” вызова функций (функция Авызывает функциюВ, а функцияВвызывает функциюА). В этом случае конфликт может быть разрешен с помощью использования прототипа функцииB:
void B ();
void A ()
{
……
B ();
……
}
void B ()
{
……
A ();
……
}
Теперь функция А“знает”, что представляет собой функцияВи как ее вызвать.
9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) Структура программы
Любая программа на языке C++ представляет собой одну или множество функций. Среди этих функций должна обязательно присутствовать главная функцияmain (), являющаяся точкой входа в программу (выполнение программы начинается с выполнения этой функции).
Основное требование по использованию функций состоит в том, что определение любой функции должно предшествовать ее вызову (компилятору необходимо “знать”, как вызвать ту или иную функцию: какое значение она возвращает, что собой представляют ее параметры). Возникновение коллизий, связанных с этим правилом, разрешается использованием прототипов функций.
В языке C++ отсутствует понятие вложенных функций, то есть внутри определять другие функции нельзя.
Глобальные и локальные данные
В языках программирования очень большое значение имеют понятия область видимостиивремя жизниобъектов программы.
Область видимости это часть текста программы, в котором может быть использован данный объект.
Время жизни переменной - интервал выполнения программы, в течение которого программный объект существует в памяти.
Оба эти понятия тесно связаны с понятием блока программы. Блоком в программе является последовательность объявлений или операторов, заключенных в фигурные скобки {}. Существуют два типа блоков:
1) составной оператор;
2) определение функции.
Блоки могут включать в себя составные операторы и другие блоки, но не могут содержать определения функции, то есть внутри функции нельзя определить другую функцию.
Объекты, объявленные вне блоков, обычно называют глобальными объектами. С этой точки зрения все функции программы являются глобальными объектами. Время жизни функций – все время выполнения программы. Область видимости функций начинается с точки ее объявления (это определение самой функции или объявление ее прототипа) и заканчивается при завершении программы. Кроме функций на глобальном уровне можно определять и другие программные объекты – константы, переменные, типы данных и т.д. Их время жизни и область видимости также начинаются с точки объявления.
Переменные и другие программные объекты, определенные внутри блока называют локальными объектами. Временем жизни таких объектов обычно является блок, в котором эти объекты определены. Область видимости локальных объектов – промежуток между объявлением локального объекта и концом блока, в котором эти объекты определены. В функции все формальные параметры и другие объекты, которые определены внутри тела функции являются локальными. Почти все они создаются в памяти (в стеке) на время работы функции и уничтожаются при ее завершении.
Рассмотрим пример:
int I = 10;// Глобальная переменная
…….
void F ( int a )// Параметра– локальная переменная
{
cout << I;// На экране 10 – значение глобальной переменнойI
……
if ( I )// Анализируется значение глобальной переменнойI
{
int I = 200, J = 3000;// Локальные переменные
cout << I;// На экране 200 – значение локальной переменнойI
…….
}
cout << I;// На экране 10 – значение глобальной переменнойI
cout << J;// Ошибка – переменнойJбольше не существует
……
}
При совпадении имен глобального и локального объекта локальный объект “перекрывает“ глобальный объект (в нашем примере – переменные I).
Время жизни и область видимости локальных переменных, определенных на уровне заголовка цикла for, – весь операторfor:
for ( int a = 0, b = 10; a < 20; ++ a, -- b)
{
…….
cout << a * b;
…….
}
Здесь, хотя переменные aиbопределены вне блока, их можно использовать внутри блока тела цикла.
Областью видимости и временем жизни программных объектов можно управлять, используя модификаторов классов памяти.