Презентация - Указатели. Использование указателей. Динамическая память

Нужно больше вариантов? Смотреть похожие
Нажмите для полного просмотра
Указатели. Использование указателей. Динамическая память
Распечатать
  • Уникальность: 86%
  • Слайдов: 52
  • Просмотров: 4032
  • Скачиваний: 2309
  • Размер: 10.89 MB
  • Онлайн: Да
  • Формат: ppt / pptx
В закладки
Оцени!
  Помогли? Поделись!

Слайды и текст этой онлайн презентации

Слайд 1

Указатели. Использование указателей. Динамическая память, слайд 1
Программирование Лекция 3. Указатели. Использование указателей. Динамическая память.

Слайд 2

Указатели. Использование указателей. Динамическая память, слайд 2
Указатели Указатель – это переменная, хранящая адрес некоторой ячейки памяти. Указатели являются типизированными: int i 3; // переменная типа int int p 0; // указатель на переменную типа int Нулевому указателю (которому присвоено значение 0) не соответствует никакая ячейка памяти. Существует 2 оператора при работе с указателями: 1) Оператор взятия адреса переменной & 2) Оператор разыменования . p &i; // указатель p указывает на переменную i (в данном случае в указатель p записывается адрес переменной i) p 10; // изменяется ячейка по адресу p, т.е. i (то есть i будет равно 10, а не 3)

Слайд 3

Указатели. Использование указателей. Динамическая память, слайд 3
Передача параметров по указателю Использование указателей позволяет реализовывать функции, которые меняют свои аргументы. Допустим, мы хотим написать функцию, которая будет менять значения переменных местами. int main () int k 10, m 20; swap (k, m); cout // 10 20 return 0; void swap (int a, int b) // функция работает с локальными копиями // переменных int t a; a b; b t; Значения k и m не поменялись местами!

Слайд 4

Указатели. Использование указателей. Динамическая память, слайд 4
Передача параметров по указателю Для того, чтобы это исправить, будем передавать не значения типа int, а указатели на эти значения. int main () int k 10, m 20; swap (&k, &m); // передаем адреса cout // 20 10 return 0; void swap (int a, int b) // функция работает с //адресами переменных int t a; a b; b t; Меняются значения, на которые указывают аргументы функции

Слайд 5

Указатели. Использование указателей. Динамическая память, слайд 5
Еще раз о массивах Массивы – это набор однотипных элементов, расположенных в памяти друг за другом, доступ к которым осуществляется по индексу. // массив 1 2 3 4 5 0 0 0 0 0 int m 10 1, 2, 3, 4, 5 ; // инициализация массива Индексация массива начинается с 0, последний элемент массива длины n имеет индекс (n-1) for (int i 0; i 10; i ) cout cout Массивы часто используются в циклах

Слайд 6

Указатели. Использование указателей. Динамическая память, слайд 6
Связь массивов и указателей Массивы тесно связаны с указателями. Указатели позволяют передвигаться по массивам. Для этого используется арифметика указателей: int m 10 1, 2, 3, 4, 5 ; int p &m 0 ; // адрес начала массива int q &m 9 ; // адрес последнего элемента массива (p k) – сдвиг на k ячеек типа int вправо (p-k) – сдвиг на k ячеек типа int влево (q-p) – количество ячеек между указателями p k эквивалентно (p k)

Слайд 7

Указатели. Использование указателей. Динамическая память, слайд 7
Примеры Заполнение массива при помощи указателя: Передача массива в функцию: указатель на начало массива Работаем с m, как будто это массив. Сначала max – это первый элемент массива

Слайд 8

Указатели. Использование указателей. Динамическая память, слайд 8
Чтение строк Для начала вам нужно подключить библиотеку string. «String» – это строка как последовательность символов, а «line» – последовательность символов, оканчивающаяся переводом строки. Решим такую задачу: пользователь вводит свое имя, а программа здоровается с ним. Сложение строк

Слайд 9

Указатели. Использование указателей. Динамическая память, слайд 9
Чтение строк При использовании cin чтение будет происходить по словам. Например, если нам понадобится считать два слова, это можно сделать, считав с помощью cin две переменные типа string. Слова могут быть разделены любым количеством пробелов, табуляций и переводом строк, но в переменных окажутся только непробельные символы.

Слайд 10

Указатели. Использование указателей. Динамическая память, слайд 10
Чтение строк Часто возникает необходимость считать строку (в понимании line) целиком, а не пословно. Для этого есть специальная функция getline(cin, s). Первый параметр в этой функции указывает на поток ввода (cin), а второй – на строку, в которую нужно считывать.

Слайд 11

Указатели. Использование указателей. Динамическая память, слайд 11
Коды символов В компьютере всё, в том числе и строки, хранится в виде чисел (строка — набор чисел, которыми кодируются символы). Для хранения одного символа используется тип char (от слова character, символ). Можно обращаться к отдельным символам строки, написав после её имени в квадратных скобках номер символа. Нумерация символов в строке начинается с нуля, так же как и в векторах. Узнать длину строки можно с помощью метода size. Когда мы выводим переменную типа char, то выводится символ. Хотя на самом деле char – числовая переменная и обозначает номер символа в кодовой таблице. Вывод кода символа выглядит так:

Слайд 12

Указатели. Использование указателей. Динамическая память, слайд 12
Выделение цифр числа Задача: получим из html-кода страницы информацию о курсах акций, чтобы заработать на их колебаниях кучу денег. Первым делом нужно выделить из строки только цифры. Мы будем считать, что в строке есть только одно целое число и его и нужно получить. Для решения этой задачи мы будем проходить по всей строке и, если символ – цифра, будем её печатать. string s; getline(cin, s); for (auto c : s) // тип char if (c '0' && c cout В этой программе мы проходим по всем символам строки (так же, по всем элементам вектора). Узнать код конкретного символа – для этого нужно записать этот символ в одинарных кавычках . Если код очередного символа лежит в пределах от 0 до 9, то этот символ – цифра.

Слайд 13

Указатели. Использование указателей. Динамическая память, слайд 13
Поиск подстроки в строке Пусть в скачанном нами файле содержится много строк, но нам интересна только та, где есть название компании, акциями которой мы хотим торговать. Например, это «Рога и копыта» с кодом на бирже rkpt. Дальше наша задача усложняется: среди N строк нужно найти ту, которая содержит подстроку rkpt (то есть где-то внутри строки встречается эта последовательность символов) и вывести число, записанное в этой строке. int n; // кол-во строк cin n; string s; getline(cin, s); for (int i 0; i n; i ) getline(cin, s); if (s.find("rkpt") ! -1) for (auto c : s) if (c '0' && c cout Метод find работает следующим образом: если подстрока нашлась, то она возвращает число, равное номеру символа, с которого началось первое вхождение подстроки в строку. А если подстроки не нашлось, то этот метод возвращает -1. Обратите внимание на getline перед циклом. Он необходим, потому что после считывания числа в этой строке остается еще и символ перевода строки. Так что когда мы сделаем первый getline, то он считает пустую строку (ведь до перевода строки ничего не осталось).

Слайд 14

Указатели. Использование указателей. Динамическая память, слайд 14
Изменение регистра символа int n; // кол-во строк cin n; string s; getline(cin, s); for (int i 0; i n; i ) getline(cin, s); string s2 ; for (auto c : s) // изменение регистра if (c a && c int al num c – a ; // номер буквы в алфавите s2 A al num; else s2 c; if ( s2 .find( RKPT") ! -1) // поиск подходящей строки for (auto c : s2 ) // s2 – теперь заглавные буквы if (c '0' && c cout Допустим, название компании может быть написано как большими, так и маленькими буквами или даже вперемешку. А значит нам нужно научиться определять регистр.

Слайд 15

Указатели. Использование указателей. Динамическая память, слайд 15
Задача Необходимо вывести символы между первым и вторым знаком препинания.

Слайд 16

Указатели. Использование указателей. Динамическая память, слайд 16
Два способа передачи массива p - указатель на начало массива Второй способ быстрее! Так как m i это (m i)

Слайд 17

Указатели. Использование указателей. Динамическая память, слайд 17
Возврат указателя из функции // первый элемент массива // возвращаем само значение макс. элемента начало массива

Слайд 18

Указатели. Использование указателей. Динамическая память, слайд 18
Возврат указателя из функции Но можно вернуть также и место в массиве, на котором находится макс. элемент. То есть указатель на макс. элемент. Эту информацию в дальнейшем можно использовать, например, чтобы переставить макс. элемент в начало. возвращается указатель! // меняем указатель на макс. элемент значение макс. элемента // получаем адрес макс. элемента и его значение

Слайд 19

Указатели. Использование указателей. Динамическая память, слайд 19
Возврат значения через указатель Если функции передали пустой массив, то функция будет сигнализировать об этом. новый параметр – указатель на результат

Слайд 20

Указатели. Использование указателей. Динамическая память, слайд 20
Недостатки указателей оператор разыменования и взятия адреса указатели на указатели если объявлен указатель, но не проинициализирован, то там хранится какой-то адрес обращение к неинициализированному указателю – ошибка. обращение к нулевому указателю – это ошибка. например, выйти за границы массива

Слайд 21

Указатели. Использование указателей. Динамическая память, слайд 21
Ссылки это ссылки На самом деле в функции используются не локальные переменные, а ссылки на эти переменные Внутри ссылок «зашиты» указатели, но синтаксически код выглядит чище, не нужно использовать оператор .

Слайд 22

Указатели. Использование указателей. Динамическая память, слайд 22
Различия ссылок и указателей для ссылок всегда нужно указывать инициализирующее значение не нужна проверка на 0

Слайд 23

Указатели. Использование указателей. Динамическая память, слайд 23
Различия ссылок и указателей Ссылки представляют идею «синонимов»

Слайд 24

Указатели. Использование указателей. Динамическая память, слайд 24
lvalue и rvalue тернарный оператор m a/2 5

Слайд 25

Указатели. Использование указателей. Динамическая память, слайд 25
Время жизни переменной foo возвращает указатель на переменную. Но a – это локальная переменная. При выходе из функции переменная a перестанет существовать. Может так случиться, что указатель или ссылка в программе указывает на переменную, которая уже не существует p указывает на переменную, которая не существует bar возвращает ссылку на локальную переменную. дальнейшее обращение к l будет некорректно

Слайд 26

Указатели. Использование указателей. Динамическая память, слайд 26
Стек вызовов

Слайд 27

Указатели. Использование указателей. Динамическая память, слайд 27
Устройство стека

Слайд 28

Указатели. Использование указателей. Динамическая память, слайд 28
Устройство стека

Слайд 29

Указатели. Использование указателей. Динамическая память, слайд 29
Устройство стека

Слайд 30

Указатели. Использование указателей. Динамическая память, слайд 30
Устройство стека

Слайд 31

Указатели. Использование указателей. Динамическая память, слайд 31
Устройство стека

Слайд 32

Указатели. Использование указателей. Динамическая память, слайд 32
Устройство стека

Слайд 33

Указатели. Использование указателей. Динамическая память, слайд 33
Вызов функции Счетчики: (вершина стека) (начало данных текущей функции)

Слайд 34

Указатели. Использование указателей. Динамическая память, слайд 34
Вызов функции (аргументы)

Слайд 35

Указатели. Использование указателей. Динамическая память, слайд 35
Вызов функции адрес возврата (регистры процессора) Возвр. значение

Слайд 36

Указатели. Использование указателей. Динамическая память, слайд 36
Вызов функции Управление передается функции foo() Счетчик перемещается (для адресации лок. переменых)

Слайд 37

Указатели. Использование указателей. Динамическая память, слайд 37
Вызов функции Временное значение

Слайд 38

Указатели. Использование указателей. Динамическая память, слайд 38
Вызов функции Вычисляются значения d и h Условное выражение вида "условие" ? "выражение 1" : "выражение 2"

Слайд 39

Указатели. Использование указателей. Динамическая память, слайд 39
Вызов функции Записывается возвр. значение

Слайд 40

Указатели. Использование указателей. Динамическая память, слайд 40
Вызов функции Функция foo () закончила свое выполнение, лок. переменные удалены

Слайд 41

Указатели. Использование указателей. Динамическая память, слайд 41
Вызов функции Изменяем значение x и избавляемся от всех доп. данных

Слайд 42

Указатели. Использование указателей. Динамическая память, слайд 42
Вызов функции Зависит от компилятора

Слайд 43

Указатели. Использование указателей. Динамическая память, слайд 43
Динамическая память Это способ выделения дополнительных областей памяти для хранения данных. Зачем нужна динамическая память? Массив будет уничтожен при выходе из функции

Слайд 44

Указатели. Использование указателей. Динамическая память, слайд 44
Выделение памяти в стиле С (самостоятельно)

Слайд 45

Указатели. Использование указателей. Динамическая память, слайд 45
Выделение памяти в стиле С (самостоятельно)

Слайд 46

Указатели. Использование указателей. Динамическая память, слайд 46
Выделение памяти в стиле С (самостоятельно) Чтобы указатель m не указывал на какую-то область памяти

Слайд 47

Указатели. Использование указателей. Динамическая память, слайд 47
Выделение памяти в стиле С

Слайд 48

Указатели. Использование указателей. Динамическая память, слайд 48
Типичные проблемы при работе с динамической памятью Память занята неравномерно

Слайд 49

Указатели. Использование указателей. Динамическая память, слайд 49
Типичные проблемы при работе с динамической памятью Программа отработает нормально

Слайд 50

Указатели. Использование указателей. Динамическая память, слайд 50
Вопросы 1) В чем разница между статической памятью и динамической? 2) Назначение указателя. 3) Что означает символ & перед переменной. 4) Что такое двойной указатель 5) Приведите пример инициализации двухмерного массива.

Слайд 51

Указатели. Использование указателей. Динамическая память, слайд 51
Задание #include using namespace std; int main() int a 5; int p &a; //объявляем указатель. cout a 6; cout p 7; cout int b 8; int p &b; cout a 9; cout p 10; cout return 0;

Слайд 52

Указатели. Использование указателей. Динамическая память, слайд 52
Решение
^ Наверх
X
Благодарим за оценку!

Мы будем признательны, если Вы так же поделитесь этой презентацией со своими друзьями и подписчиками.