Слайд 1Технологии программирования
Доц. каф. «Медиаменеджмента и медиапроизводства» Евич Л.Н.
Слайд 2Лекция 10. Указатели в С++.
Каждая переменная программы имеет свой адрес,
для хранения которого можно использовать указатель на эту переменную.
Указатель -
это переменная, значением которой является адрес другой переменной. Так как указатель может ссылаться на переменные разных типов, с указателем в языке С++ связывается тип того объекта, на который он ссылается.
Для описания указателей используется операция косвенной адресации *.
Слайд 3Лекция 10. Указатели в С++.
Допустим, что переменная var1 имеет тип
int. Чтобы объявить указатель для хранения адреса этой переменной нужно
объявить переменную, например, pVar, которая будет содержать адрес значения типа int.
Это описывается так :
int *pVar.
Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адрес этой переменной, а не ее текущее значение. Если указателю нужно присвоить пустое значение, что уму присваивается значение 0.
Слайд 4Лекция 10. Указатели в С++.
Пример 1.
int var1=-15;
int *pVar=0;
pVar=&var1;
Слайд 5Лекция 10. Указатели в С++.
Оператор разименования (*) перед именем переменной
pVar может рассматриваться как «значение, хранящееся по адресу».
*pVar=12;
cout
Слайд 6Лекция 10. Указатели в С++.
Если переменная pVar объявлена как указатель,
то оператор присваивания pVar=&var1 означает: "взять адресс переменной var1 и
присвоить его значение переменной-указателю pVar ".
Заметим, что если pVar — некоторый указатель, то pVar ++ увеличивает его значение и он теперь указывает на следующий, соседний адресуемый объект. Значение pVar используется в выражении, а затем увеличивается. Аналогично определяются операции pVar --, ++ pVar, -- pVar. В общем случае указатель pVar можно скаладывать с целым числом i.
Оператор pVar +=i передвигает ссылку на i элементов относительно текущего значения. Эти конструкции подчиняются правилам адресной арифметики.
Слайд 7Лекция 10. Указатели в С++.
Вернемся к массивам. Пусть имеется описание
short a[5];
Оно определяет массив размером 5 элементов, т.е. пять
последовательно расположенных ячеек памяти a[0], a[1], a[2], a[3], a[4].
short a[5];
Слайд 8Лекция 10. Указатели в С++.
Адрес i-го элемента массива равен сумме
адреса начального элемента массива и смещения этого элемента на i
единиц от начала массива. Это достигается индексированием: a[i] — i -й элемент массива. Но доступ к любому элементу массива может быть выполнен и с помощью указателей, причем, более эффективно.
Слайд 9Лекция 10. Указатели в С++.
Если pVar — указатель на short,
описанный как
short * pVar, то pVar после выполнения операции
pVar =&a[0] содержит адрес a[0], а pVar +i указывает на i -й элемент массива. Таким образом, pVar +i является адресом элемента a[i], а *( pVar +i) — содержимым i- го элемента
Слайд 10Лекция 10. Указатели в С++.
(операции * и & более приоритетны,
чем арифметические операции). Так как имя массива в программе отождествляется
с адресом его первого элемента, то выражение pVar =&a[0] эквивалентно такому: pVar =a. Поэтому значение a[i] можно записать как *(a+i). Применив к этим двум элементам операцию взятия адреса, получим, что &a[i] и a+i идентичны.
Слайд 11Лекция 10. Указатели в С++.
Указатели применяются для:
Размещения данных в
свободных областях памяти и доступа к ним;
Доступа к переменным
и функциям классов;
Передачи параметров в функции по ссылке.
Слайд 12Лекция 10. Указатели в С++.
Память условно разделена на пять областей:
Область глобальных переменных
Свободная, или динамически распределенная память;
Регистровая память
(регистры);
Сегменты программы;
Стековая память.
Слайд 13Лекция 10. Указатели в С++.
Локальные переменные и параметры функций размещаются
в стековой памяти.
Программный код хранится в сегментах, глобальные переменные
— в области глобальных переменных.
Растровая память предназначена для хранения внутренних служебных данных программы, таких как адрес вершины стека или адрес команды.
Остальная память составляет так называемую свободную память — область памяти, динамически распределяемую между объектами.
Слайд 14Лекция 10. Указатели в С++.
Особенностью локальных переменных является то, что
после выхода из функции, в которой они были объявлены, память,
выделенная для их хранения, освобождается, а значения переменных уничтожается.
Глобальные переменные позволяют частично решить эту проблему ценой неограниченного доступа к ним из любой точки программы. Использование динамической памяти решает обе проблемы.
Слайд 15Лекция 10. Указатели в С++.
В отличие от стека переменных, ячейкам
свободной памяти нельзя присвоить имя. Доступ к ним осуществляется посредством
указателя, хранящего адрес нужной ячейки.
В отличие от стековой памяти, динамическая память не очищается до завершения работы программы, поэтому освобождением памяти должен заниматься программист.
Слайд 16Лекция 10. Указатели в С++.
Оператор new.
Для выделения памяти в области
динамического распределения используется ключевое слово new.
Пример
int *pVar = new int;
float
* pVar2 = new float;
В каждом случае указатели pVar и pVar1 будут указывать на ячейку памяти в области динамической памяти, содержащую значение int и float соответственно.
Слайд 17Лекция 10. Указатели в С++.
Оператор delete.
Если память, выделенная под переменную
больше не нужна, ее следует освободить с помощью оператора delete.
Пример
int
*pVar = new int;
delete pVar;
При этом происходит не удаление указателя, а освобождение области памяти по адресу, записанному в нем.
Слайд 18Лекция 10. Указатели в С++.
Утечка памяти.
При невнимательной работе с указателями
может происходить «утечка памяти».
Это происходит в том случае, если
указателю присваивается новое значение, а память, на которую он ссылался не освобождается.
Слайд 19Лекция 10. Указатели в С++.
Доступ к членам классов.
struct data {
int p;
int c;
}
data * Var1;
data Var2;
Доступ
к членам класса data:
Var2.p=2;
Var2.c=3;
(* Var1).p=5; // Var1->p=5;
(*Var1).c=12; // Var1->c=12;
Слайд 20Лекция 10. Указатели в С++.
Динамические структуры.
struct data {
int
p;
data * next;
};
data * var1;
var1 = new data;
var1->p=5;
var1->next=
new data;
var1=var1->next;
Слайд 21Лекция 10. Указатели в С++.
Задания для самостоятельной работы.
75. Составьте программу,
которая:
создает список из 10-ти элеменов;
удаляет 1-й элемент списка.
удаляет последний
элемент списка
вставляет после третьего элемента новый
удаляет элемент равный 4-м (если такой имеется)
меняет местами 3-й и 6-й ‘элементы.