Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Konspekt_S__Chast_2.doc
Скачиваний:
31
Добавлен:
09.02.2015
Размер:
1 Mб
Скачать

C++

Конспект лекций Часть 2 Оглавление

Часть 2 1

Оглавление 2

8. Указатели 4

8.1. Указатели 4

Понятие указателя 4

Работа с указателями 5

Арифметика указателей 7

Ошибки при работе с указателями 8

8.2. Указатели и массивы 10

9. Функции и структура программы 12

9.1. Создание и использование функций 13

Процедурный подход к разработке программ 13

Определение функций в программе 19

Завершение работы функции (инструкция return) 20

Список параметров функций 21

Обращение к функциям в программе 21

Передача данных по значению 22

Передача данных с помощью указателей 23

Передача данных по ссылке 25

Перегружаемые функции 26

Параметры по умолчанию 27

Функции с переменным числом параметров 27

Рекурсивное использование функций 29

Передача функций в качестве параметров 32

Встраиваемые функции (inline - функции) 33

Прототипы функций 34

9.2. Структура программы. Глобальные и локальные данные (области видимости и время жизни) 35

Структура программы 35

Глобальные и локальные данные 35

Классы памяти 36

Многофайловые проекты 39

10. Структуры, объединения, перечисления 39

10.1. Структуры 39

Определение структур 39

Доступ к полям структур 40

Указатели на структуры 42

Структурные параметры функций 42

Битовые поля структур 44

10.2. Объединения 45

Обычные объединения 45

Анонимные объединения 46

10.3. Перечисления 47

11. Организация работы с файлами 48

11.1. Потоки для работы с файлами 48

Общие сведения 48

Пример работы с файлом 48

11.2. Работа с файлами 49

Создание потока, открытие и закрытие файла 49

Запись и чтение данных в текстовых файлах 51

Запись и чтение данных в двоичном режиме 51

Как обнаружить конец файла? 54

Прямой доступ при работе с файлами 54

Статус потоков ввода-вывода 55

Некоторые другие функции управления потоками ввода-вывода 56

Примеры по работе с файлами 56

12. Работа с динамической памятью 59

Распределение памяти при работе программы 59

Динамическое выделение и освобождение памяти в стиле C++ 59

Динамическое выделение и освобождение памяти в стиле C 62

Возможные ошибки при работе с динамической памятью 63

Динамические массивы 64

Одномерные однонаправленные списки 70

Одномерные двунаправленные списки 75

Многомерные списки 77

Стек 77

13. Знакомство с классами 77

13.1. Понятие класса 77

13.2. Пример создания класса 77

8. Указатели

Указатели и ссылки являются одними из самых важных и достаточно сложных для понимания и использования средств языка программирования. Они ориентированы на прямую работу с памятью компьютера. С помощью этих средств реализуется работа с динамической памятью и динамическими объектами, возвращение из функций измененных данных и многое другое. К использованию указателей и ссылок мы будем неоднократно возвращаться в последующих разделах.

8.1. Указатели Понятие указателя

Все данные (переменные, константы и др.) хранятся в памяти. Память представляет собой непрерывную последовательность ячеек (байтов), каждая из которых имеет свой номер – адрес:

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

При определении, например, некоторой переменной, она располагается в памяти по определенному адресу и занимает столько ячеек, сколько требует тип этой переменной. Пусть, например, имеется переменные int A = 2351иdouble B = 3.1и пусть они располагаются в памяти так:

А = 2351

B = 3.14

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

Говорят, что переменная Арасполагается по адресу 101 и занимает 4 байта, а переменнаяBимеет адрес 105 и занимает 8 байт памяти.

Для получения адреса какого-либо программного объекта используется оператор &. Например, если выполнить фрагмент следующей программы (в предположении, что переменныеAиBрасполагаются в памяти, как это показано на предыдущем рисунке):

int A = 2351;

double B = 3.14;

cout << “Значение переменной А: ” << A << endl;

cout << “Адрес переменной А: ” << &A << endl;

cout << “Значение переменной В: ” << В << endl;

cout << “Адрес переменной В: ” << &В << endl;

получим следующий результат:

Значение переменной А: 2351

Адрес переменной А: 101

Значение переменной В: 3.14

Адрес переменной В: 105

Правда, значения адресов переменных будут выведены в шестнадцатеричном формате.

Указатели– это тоже обычные переменные, но онислужат для хранения адресов памяти.

Указатели определяются в программе следующим образом:

<тип данных> *<имя переменной>

Здесь <тип данных> определяет так называемыйбазовый тип указателя.

<Имя переменной> является идентификатором переменной-указателя.

Признаком того, что это переменная указатель, является символ *, располагающийся между базовым типом указателя и именем переменной-указателя.

Например:

int *p1;

double *p2;

Здесь определены две переменные-указатели (или просто – два указателя). Указатель p1является переменной-указателем на базовый типint (или, как говорят, переменнаяp1указывает наint - значение), а указательp2указывает наdouble – значение.

Иными словами, переменная p1предназначена для хранения адресов участков памяти, размер которых соответствует типуint (4 байта), а переменнаяp2- для хранения адресов участков памяти, размер которых соответствует типуdouble (8 байт).

Формально указатели представляют собой обычные целые значения типа int и занимают в памяти 4 байта не зависимо от базового типа указателя. Значения указателей при их выводе на экран представляются как целые значения в шестнадцатеричном формате.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]