Similar presentations:
Указатели в С++
1.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИфедеральное государственное бюджетное образовательное учреждение
высшего образования
«Сибирский государственный университет науки и технологий
имени академика М.Ф. Решетнева»
Кафедра Информатики и вычислительной техники
Дисциплина: Программирование (С++)
ЛЕКЦИЯ
«УКАЗАТЕЛИ в С++»
Читает старший преподаватель
Филимонова Ольга Александровна
2.
Цель:Научиться работать с
переменной, зная только ее
адрес
3.
Что такое указательУказатель – это переменная, которая содержит адрес
переменной соответствующего типа
Адресом переменной является адрес первого байта памяти,
выделенной под эту переменную
4.
Зачем нужны указатели?1) Упрощение алгоритма и повышения его
эффективности;
2) Эффективное управление динамической памятью;
3) Эффективный обмен данными между функциями.
Передача больших объёмов данных (массивов) в
функцию осуществляется только через адрес.
5.
Как объявить указатель?Синтаксис:
ИмяТипа * ИмяУказателя;
Пример:
6.
Как в указатель поместитьадрес?
7.
Способ 1:Записать в указатель адрес существующей переменной.
double a, *p;
a
p=&a;
//& - операция определения адреса
по имени переменной
p
8.
Способ 2:Записать в указатель адрес из другого указателя,
уже правильно инициализированного.
double a, *p1, *p2;
p1=&a;
//p1 инициализировали адресом переменной a
p2=p1;
//в p2 записали «правильный» адрес из p1
9.
Типы памятиСтатическая
Статическая память выделяется при компиляции программы.
Объём выделяемой статической памяти должен быть
всегда заранее известен.
У статической переменной указывается класс памяти, в
соответствии с которым переменной назначается область
действия и время жизни
10.
Типы памятиДинамическая
Динамическая память выделяется во время выполнения
программы особой командой (new), и сохраняется так долго,
как мы этого пожелаем. После чего память освобождается.
Операция new выделяет память и возвращает в качестве
результата адрес первого байта выделенной памяти.
В нужном месте программы память надо освободить
(операция delete).
11.
Способ 3:Записать в указатель адрес, полученный при выделении
динамической памяти.
Выделить память динамически
(new) под одну переменную типа
int.
В нужный момент времени память
надо освободить (delete)
p1
12.
Способ 3:Записать в указатель адрес, полученный при выделении
динамической памяти, с инициализацией переменной.
Выделить память динамически
(new) под одну переменную типа int
и поместить в эту переменную
значение 10
10
p2
13.
Способ 3:Записать в указатель адрес первой переменной
при выделении динамической памяти под N переменных.
Вариант 1
Вариант 2
Выделить память
динамически под N
переменных типа int, лежащих
в памяти подряд.
В p3 запишется адрес первой
переменной.
Не забываем освобождать
память: [ ] при выделении и
при освобождении памяти
14.
Способ 4:Указатель на тип void
В указатель на тип void можно поместить
адрес любого данного. Компилятор не
допускает присваивания чужих адресов.
Поэтому берем ответственность на себя,
написав операцию приведения к типу
(void*).
15.
Операции над указателями16.
Унарная операция разадресации (*)(определение значения по адресу)
При работе с указателями часто возникает
вопрос: писать * или нет?
Действовать по смыслу!
Работа с адресом –
*(звёздочку) не пишу!
Работа со значением по адресу *(звёздочку) пишу!
double a, *p;
int *p= new int;
p = &a;
*p = 25;
17.
Увеличение указателя на числоК указателю можно прибавить целое число m, при этом мы
сместимся в памяти вперёд на m элементов этого же типа.
p
p+=m;
p+1
p+2
p+3
(p+m)
p+4
p++;
При этом необходимо знать, что в памяти подряд
расположены данные одного типа
18.
Уменьшение указателя на числоАналогично, от указателя можно отнять целое число m, при
этом мы сместимся в памяти назад на m элементов этого же
типа.
p-4
p-=m;
p-3
p-2
p-1
(p-m)
p
p--;
При этом необходимо знать, что в памяти подряд
расположены данные одного типа
19.
Сравнение адресовДва адреса на один тип можно сравнить с помощью
операции отношения
20.
Расстояние между объектамиМожно найти разность между двумя указателями на один тип
и определить, на каком расстоянии находятся два объекта
m
p
result = p – m;
21.
Задача .Выделить память динамически под 5 данных типа double, идущих
в памяти подряд, и присвоить им значение 1, 2, 3, 4, 5
22.
Пример использования динамическихпеременных
programming