- •Лекция №1. Заглянем в компьютер Введение
- •Структура компьютера
- •Данные и программы
- •Языки высокого уровня и системы программирования
- •Состав языка
- •Алфавит языка
- •Идентификаторы
- •Ключевые слова
- •Знаки операций
- •Константы
- •Комментарии
- •Концепция типа данных
- •Основные типы данных
- •Целый тип (int)
- •Символьный тип (char)
- •Расширенный символьный тип (wchar_t)
- •Логический тип (bool)
- •Типы с плавающей точкой (float, double и long double)
- •Диапазоны значений простых типов данных для ibm pc
- •Переменные
- •Лекция № 3. Структура программы. Операции. Выражения
- •Структура программы
- •Спецификации формата для функций семейства printf
- •Модификаторы формата
- •Операции
- •Выражения
- •Арифметические преобразования типов
- •Лекция № 4. Структура программы. Операции. Выражения
- •Базовые конструкции структурного программирования
- •Оператор «выражение»
- •Операторы ветвления
- •Условный оператор if
- •If ( выражение) оператор_1; [else оператор_2]
- •Оператор switch
- •Операторы цикла
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Цикл с параметром (for)
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Лекция 5. Указатели и массивы
- •Указатели
- •Инициализация указателей
- •1. Присваивание указателю адреса существующего объекта:
- •2. Присваивание указателю адреса области памяти в явном виде:
- •3. Присваивание пустого значения:
- •4. Выделение участка динамической памяти и присваивание ее адреса указателю:
- •Операции с указателями
- •Массивы
- •5.1. Стандартные алгоритмы работы с одномерными массивами
- •7. Сортировка целочисленного массива методом пузырьковой сортировкой.
- •5.2. Динамические массивы
- •5.3. Многомерные массивы
- •5.4. Стандартные алгоритмы работы с двумерными массивами
- •Лекция 6. Введение в обработку символов и строк
- •Основы теории символов и строк
- •Функции работы со строками из библиотеки обработки строк
- •Функции работы со строками из библиотеки обработки
- •Работа с символами
- •Модульное программирование Лекция № 7 Функции
- •Функции
- •Объявление и определение функций
- •Глобальные переменные
- •Возвращаемое значение
- •Параметры функции
- •Передача массивов в качестве параметров
- •Передача имен функций в качестве параметров
- •Параметры со значениями по умолчанию
- •Функции с переменным числом параметров
Лекция 5. Указатели и массивы
Указатели
Когда компилятор обрабатывает оператор определения переменной, например, int i=10;, он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее имени (i) заменяются компилятором на адрес области памяти, в которой хранится значение переменной. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями.
Итак, указатели предназначены для хранения адресов областей памяти. В С++ различают три вида указателей:
указатель на объект;
указатель на функцию;
указатель на void,
отличающиеся свойствами и набором допустимых операций. Указатель не является самостоятельным типом, он всегда связан с каким-либо другим конкретным типом.
Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции, то есть адрес, по которому передается управление при вызове функции. Указатели на функции используются для косвенного вызова функции (не через ее имя, а через обращение к переменной, хранящей ее адрес), а также для передачи имени функции в другую функцию в качестве параметра. Указатель функции имеет тип «указатель функции, возвращающей значение заданного типа и имеющей аргументы заданного типа»:
тип (*имя) ( список_типов_аргументов );
Например, объявление:
int (*fun) (double, double);
задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую два аргумента типа double.
Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного). Простейшее объявление указателя на объект (в дальнейшем называемого просто указателем) имеет вид:
тип *имя;
где тип может быть любым, кроме ссылки и битового поля, причем тип может быть к этому моменту только объявлен, но еще не определен.
Звездочка относится непосредственно к имени, поэтому для того, чтобы объявить несколько указателей, требуется ставить ее перед именем каждого из них. Например, в операторе
int *а, b, *с;
описываются два указателя на целое с именами а и с, а также целая переменная b.
Размер указателя зависит от модели памяти. Можно определить указатель на указатель и т. д.
Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов).
Указателю на void можно присвоить значение указателя любого типа, а также сравнивать его с любыми указателями, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом.
Указатель может быть константой или переменной, а также указывать на константу или переменную. Рассмотрим примеры:
int i; // целая переменная
const int ci = 1; // целая константа
int * pi; // указатель на целую переменную
const int * pci; // указатель на целую константу
int * const ср = &i; // указатель-константа на целую переменную
const int * const срс = &ci; // указатель-константа на целую константу
Как видно из примеров, модификатор const, находящийся между именем указателя и звездочкой, относится к самому указателю и запрещает его изменение, a const слева от звездочки задает постоянство значения, на которое он указывает. Для инициализации указателей использована операция получения адреса &.
Величины типа указатель подчиняются общим правилам определения области действия, видимости и времени жизни.