Презентация на тему: Лекция 6. C++. Указатели. Работа с указателями

Лекция 6. C++. Указатели. Работа с указателями.
План.
Виды переменных
Лекция 6. C++. Указатели. Работа с указателями.
Указатели
Объявление указателей
Пример
Операторы для работы с указателями
Лекция 6. C++. Указатели. Работа с указателями.
Пример.
Выражения, содержащие указатели
Присваивание указателей
Адресная арифметика
Лекция 6. C++. Указатели. Работа с указателями.
Правила адресной арифметики.
Сравнение указателей
Пример. Функции для работы со структурой типа стек.
Лекция 6. C++. Указатели. Работа с указателями.
Лекция 6. C++. Указатели. Работа с указателями.
Лекция 6. C++. Указатели. Работа с указателями.
Косвенная адресация
Лекция 6. C++. Указатели. Работа с указателями.
Объявление переменной
Извлечение значения в косвенной адресации
Пример
Инициализация указателей
Динамическое распределение памяти
Динамическое распределение памяти
Лекция 6. C++. Указатели. Работа с указателями.
Проблемы при работе с указателями
Лекция 6. C++. Указатели. Работа с указателями.
Итоги
1/32
Средняя оценка: 4.3/5 (всего оценок: 63)
Код скопирован в буфер обмена
Скачать (119 Кб)
1

Первый слайд презентации: Лекция 6. C++. Указатели. Работа с указателями

Языки и методы программирования. Ст. преп. М.А. Сокольская

Изображение слайда
2

Слайд 2: План

2 2 План. Динамические переменные. Указатели. Операторы для работы с указателями. Выражения, содержащие указатели.

Изображение слайда
3

Слайд 3: Виды переменных

3 Виды переменных Статические переменные – автоматически создаваемые в начале исполнения блока программы и уничтожаемые по окончании работы блока. Размещение в памяти – на этапе трансляции. Динамические переменные. Переменные, выделение и очистка памяти для которых происходит в процессе выполнения программы.

Изображение слайда
4

Слайд 4

4 Динамические переменные используются, если: размер необходимой структуры заранее неизвестен структура может видоизменяться в процессе работы программы. В языке С++ динамические переменные реализованы через указатели.

Изображение слайда
5

Слайд 5: Указатели

5 Указатели Определение : Указатель ( pointer ) – это переменная, в которой хранится адрес другого объекта (как правило другой переменной). Т.е. значением переменной-указателя является адрес ячейки памяти, в которой содержится динамическая величина.

Изображение слайда
6

Слайд 6: Объявление указателей

6 Объявление указателей Переменная, хранящая адрес ячейки памяти должна быть объявлена как указатель в разделе объявления переменных. Синтаксис : тип_указателя *имя_указателя Тип указателя – это базовый тип указателя (любой допустимый тип).

Изображение слайда
7

Слайд 7: Пример

7 Пример int main (void) { double x=10.5, y; int *p; char *p1; … } Если переменная занимает несколько ячеек памяти, то ее адресом считается адрес первой ячейки.

Изображение слайда
8

Слайд 8: Операторы для работы с указателями

8 Операторы для работы с указателями Существует два специальных оператора для работы с указателями. & - оператор получения адреса. p = &count; // присвоить указателю p адрес // переменной count * - оператор разыменования указателя. q = *p; // значение, хранящееся по адресу p // присвоить q

Изображение слайда
9

Слайд 9

9 Приоритет операторов * и & выше приоритета всех арифметических операторов. При использовании указателей необходимо следить за тем, чтобы указатель всегда ссылался на переменную правильного типа (не всякий компилятор отслеживает такие ошибки).

Изображение слайда
10

Слайд 10: Пример

10 Пример. #include <iostream.h> int main (void) { double x=5.6, y; int n; int *p, *p1; p = &n; // верная запись p1 = &x; // нежелательная запись y = *p1; cout<< y; // не выведет число 5,6 return 0; }

Изображение слайда
11

Слайд 11: Выражения, содержащие указатели

11 Выражения, содержащие указатели Обычно, выражения, содержащие указатели, подчиняются стандарту, но у них есть свои особенности. Особенности проявляются в случаях: - присваивания указателей. - адресной арифметики - сравнения указателей

Изображение слайда
12

Слайд 12: Присваивание указателей

12 Присваивание указателей Указатель можно присвоить другому указателю. Пример. #include <iostream.h> int main (void) { int x; int *p1, *p2; p1 = &x; p2 = p1; cout<< p2; // выведет на экран адрес переменной x return 0 }

Изображение слайда
13

Слайд 13: Адресная арифметика

13 Адресная арифметика К указателям применимы только две арифметических операции: сложение вычитание Пример. Пусть указатель p1 ссылается на целочисленную переменную, размещенную по адресу 2000. Пусть целые числа занимают 2 байта в памяти. p1++; Чему будет равно значение p1?

Изображение слайда
14

Слайд 14

14 p1 будет равно 2002, т.к. указатель будет ссылаться на следующее целое число. Выражение p1--; присвоит указателю p1 снова значение 2000.

Изображение слайда
15

Слайд 15: Правила адресной арифметики

15 Правила адресной арифметики. 1. При увеличении на 1 указатель ссылается на ячейку, в которой хранится следующий элемент базового типа. 2. При уменьшении на 1 указатель ссылается на ячейку, в которой хранится предыдущий элемент базового типа. 3. В целом указатели увеличиваются или уменьшаются на длину соответствующих переменных, на которые они ссылаются. 4. Указатели можно вычитать.

Изображение слайда
16

Слайд 16: Сравнение указателей

16 Сравнение указателей Указатели можно сравнивать между собой. Пример. if (p<q) cout <<“ Указатель p содержит меньший адрес, чем указатель q”; Указатели сравниваются, если они ссылаются на один и тот же объект (например массив) для контроля размерности или переполнения конструкции

Изображение слайда
17

Слайд 17: Пример. Функции для работы со структурой типа стек

17 Пример. Функции для работы со структурой типа стек. #include <iostream.h> #include <stdlib.h> int *top, *p1, stack [50]; int main (void) { int value; // значение для размещения в стеке top = stack; // указатель ссылается на вершину стека p 1 = stack; // инициализация указателя p1

Изображение слайда
18

Слайд 18

18 do { cout<<“ Введите число: “; cin>>value; if (value!=0) { p1++; if (p1 == (top + SIZE)) { cout<< “ Стек переполнен. “; exit (1); }

Изображение слайда
19

Слайд 19

19 *p1 = value; // записать значение value в // адрес, хранимый в p1 } else { if (p1 == top) { cout<< Стек исчерпан. ; exit (1); }

Изображение слайда
20

Слайд 20

20 p1--; // уменьшаем указатель на 1 // (переводим к предыдущему элементу) cout<<“ Число на вершине стека равно ”<< *(p1+1)<<endl; } } while (value!=-1); return 0 }

Изображение слайда
21

Слайд 21: Косвенная адресация

Указатель ссылается на другой указатель, который содержит адрес обычной переменной. Такая схема называется косвенной адресацией или указателем на указатель. Минус : снижение наглядности программы. Глубина косвенной адресации не ограничена. 21

Изображение слайда
22

Слайд 22

22

Изображение слайда
23

Слайд 23: Объявление переменной

Переменная, представляющая собой указатель на указатель объявляется следующим образом: базовый_тип **имя_указателя ; Например: double **point; 23

Изображение слайда
24

Слайд 24: Извлечение значения в косвенной адресации

Если переменная объявлена как указатель на указатель, то для извлечения значения дважды применяется оператор разыменования. 24

Изображение слайда
25

Слайд 25: Пример

#include <stdio.h> int main() { int x, *p, **q; x=10; p=&x; q=&p; printf (“%d”, **q);// вывод числа x return 0; } 25

Изображение слайда
26

Слайд 26: Инициализация указателей

Если указатель объявлен, но не инициализирован, то его значение остаётся неопределённым. Эта ситуация может приводит к непредсказуемым последствиям. Указатель, не ссылающийся на конкретную ячейку памяти должен быть равен нулю. int *s; s=0; или s=NULL; Часто инициализируются строки. 26

Изображение слайда
27

Слайд 27: Динамическое распределение памяти

Получение программой необходимой памяти в процессе её выполнения. Память, выделяемая при распределении находится в куче (heap), которая представляет собой область свободной памяти между кодом программы, сегментом данных и стеком. Размер кучи заранее неизвестен. 27

Изображение слайда
28

Слайд 28: Динамическое распределение памяти

Выделение памяти. Оператор new выделяет область памяти и возвращает указатель на ее первую ячейку. указатель = new тип ; Например: int *s; s = new int; Оператор delete применяется только к результату оператора new. 28

Изображение слайда
29

Слайд 29

Освобождение памяти. Оператор delete освобождает память, выделенную с помощью оператора new. delete указатель ; Например: int *s; s = new int; // работа с указателем s delete s; 29

Изображение слайда
30

Слайд 30: Проблемы при работе с указателями

Неинициализированный указатель. int main() { int x, *p; x=10; *p=x; return 0; } Число 10 записывается в неизвестную область памяти. 30

Изображение слайда
31

Слайд 31

2. Неправильная работа с указателями. int x, *p; x = 10; p = x; printf (“%d”, *p); Неверное присваивание p=x, поэтому непредсказуемое значение на экране. 31

Изображение слайда
32

Последний слайд презентации: Лекция 6. C++. Указатели. Работа с указателями: Итоги

32 32 Итоги Мы вспомнили основы языка С/С++. Рассмотрели понятие указателя, операторы работы с указателями, принципы интерпретации выражений, содержащих указатели.

Изображение слайда