205.14K
Категория: ПрограммированиеПрограммирование

Указатели в С++

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.

Пример использования динамических
переменных
English     Русский Правила