Указатели
Оглавление
Часть 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
10.2. Объединения. 44
Обычные объединения. 44
Анонимные объединения. 45
10.3. Перечисления. 46
11. Организация ввода/вывода и работа с файлами. 46
11.1. Потоки для работы с файлами. 46
Общие сведения. 46
Пример работы с файлом.. 46
Создание потока, открытие и закрытие файла. 47
Запись и чтение данных в текстовых файлах. 49
Запись и чтение данных в двоичном режиме. 49
Как обнаружить конец файла?. 52
Прямой доступ при работе с файлами. 52
8. Указатели
Указатели и ссылки являются одними из самых важных и достаточно сложных для понимания и использования средств языка программирования. Они ориентированы на прямую работу с памятью компьютера. С помощью этих средств реализуется работа с динамической памятью и динамическими объектами, возвращение из функций измененных данных и многое другое. К использованию указателей и ссылок мы будем неоднократно возвращаться в последующих разделах.
|
|
Все данные (переменные, константы и др.) хранятся в памяти. Память представляет собой непрерывную последовательность ячеек (байтов), каждая из которых имеет свой номер – адрес:
… | … | ||||||||||||||||||||||||||||||||||||||
При определении, например, некоторой переменной, она располагается в памяти по определенному адресу и занимает столько ячеек, сколько требует тип этой переменной. Пусть, например, имеется переменные int A = 2351 и double B = 3.1 и пусть они располагаются в памяти так:
А = 2351 | B = 3.14 | ||||||||||||||||||||||||||||||||||||||
… | … | ||||||||||||||||||||||||||||||||||||||
Говорят, что переменная А располагается по адресу 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 байта не зависимо от базового типа указателя. Значения указателей при их выводе на экран представляются как целые значения в шестнадцатеричном формате.