Указатели. Лекция 5. Виды оперативной памяти презентация

Содержание


Презентации» Информатика» Указатели. Лекция 5. Виды оперативной памяти
Лекция 5Современные языки программирования работают с тремя видами памяти:
 Современные языки программированияВ статической памяти располагаются:
 В статической памяти располагаются:
 переменные, определения которыхПрограммные объекты (переменные и функции), размещенные в статической памяти, существуют сВ автоматической памяти располагаются:
 В автоматической памяти располагаются:
 переменные, определения которыхКаждой выполняющейся программе выделяется область памяти, которую называют динамической памятью
 КаждойДинамические переменные создаются в процессе выполнения программы выполнением унарной операции newОперативная память представляет собой пронумерованную последовательность байт 
 Оперативная память представляетВ дальнейшем будем полагать максимальное значение адреса равным 232 -1
 ВДоступ к динамическим переменным возможен только путем непосредственного указания их адресаТаким образом, указатели – это переменные, хранящие адреса других программных объектов
Синтаксис объявления указателя на переменную:
 Синтаксис объявления указателя на переменную:
 		<типКроме того, константами могут быть сами указатели, т.е. содержать адреса, неПеременная (константа), адрес которой хранится в некотором указателе, называется указанной переменнойПрисваивание указателю адреса существующей переменной (константы):
 Присваивание указателю адреса существующей переменнойВ первом способе инициализации используется унарная операция получения адреса
 В первомПри объявлении указателя надо сразу выполнять его инициализацию
 При объявлении указателяДинамические переменные (константы) создаются в динамической области памяти (heap – куча)
Создание динамических переменных происходит в момент выделения им места в памяти
Для удаления динамических переменных и констант с освобождением памяти используют унарнуюВместо использования операций delete можно просто присваивать переменной-указателю значение NULL
 ВместоПрограмма «Объявление указателей»
 Программа «Объявление указателей»
 Листинг программыСинтаксис объявления
 Синтаксис объявления
 		void *<имя указателя>
 Применяется в тех случаях,Указателю на void можно присвоить значение указателя любого типа, но передКроме четырех рассмотренных выше унарных операций (*, &, new и delete)Операция инкремента (декремента) увеличивает (уменьшает) значение указателя, связанного с некоторым типом,Разность двух указателей одного типа равна разности их значений, деленной наВ языке C++ указатели играют очень важную роль, обеспечивая ряд особенностейВ языках C и C++ существует тесная связь между массивами иДля обращения к элементам массива можно использовать операции адресной арифметики
 ДляИспользование указателей позволяет создавать массивы, размер которых определяется уже в процессеДля создания динамического массива необходимо объявить указатель, который будет играть рольДинамический массив не инициализируется и его элементы не обнуляются
 Динамический массивДвумерные массивы с фиксированными на этапе компиляции размерами объявляются следующим образом:
Например:
 Например:
 		const int n = 2;
 		int a [n] [2В двумерном массиве a[i] является указателем-константой на начало i–й строки, т.е.Для создания динамического двумерного массива следует объявить указатель на массив указателей:
Далее следует инициализировать каждый из элементов массива указателей:
 Далее следует инициализироватьВозможность задавать длину для каждой строки двумерного массива позволяет формировать массивыЛогическому делению оперативной памяти на статическую, автоматическую и динамическую соответствует делениеКоды функций размещаются в сегменте команд CS
 Коды функций размещаются вУказатели могут использоваться для доступа как к статическим (поименованным), так иПример работы со строками через указатели
 Пример работы со строками через



Слайды и текст этой презентации
Слайд 1
Описание слайда:
Лекция 5


Слайд 2
Описание слайда:
Современные языки программирования работают с тремя видами памяти: Современные языки программирования работают с тремя видами памяти: статической, автоматической, динамической

Слайд 3
Описание слайда:
В статической памяти располагаются: В статической памяти располагаются: переменные, определения которых расположены вне каких-либо функций или блоков (глобальные переменные); переменные, определенные внутри функций или блоков с использованием спецификатора static (локальные статические переменные); коды функций

Слайд 4
Описание слайда:
Программные объекты (переменные и функции), размещенные в статической памяти, существуют с момента начала выполнения программы и до ее завершения Программные объекты (переменные и функции), размещенные в статической памяти, существуют с момента начала выполнения программы и до ее завершения

Слайд 5
Описание слайда:
В автоматической памяти располагаются: В автоматической памяти располагаются: переменные, определения которых расположены внутри каких-либо функций или блоков (локальные переменные); фактические параметры функций, передаваемые им при вызове Переменные, размещенные в автоматической памяти, существуют до момента завершения выполнения функции после чего автоматическая память очищается

Слайд 6
Описание слайда:
Каждой выполняющейся программе выделяется область памяти, которую называют динамической памятью Каждой выполняющейся программе выделяется область памяти, которую называют динамической памятью Динамическая память используется для размещения переменных и структур данных, создаваемых в процессе выполнения программ Такие переменные называются динамическими переменными

Слайд 7
Описание слайда:
Динамические переменные создаются в процессе выполнения программы выполнением унарной операции new и существуют до их удаления унарной операцией delete Динамические переменные создаются в процессе выполнения программы выполнением унарной операции new и существуют до их удаления унарной операцией delete Особенности динамических переменных: эти переменные не имеют имен; это неинициализированные переменные, поэтому перед использованием они должны быть инициализированы

Слайд 8
Описание слайда:
Оперативная память представляет собой пронумерованную последовательность байт Оперативная память представляет собой пронумерованную последовательность байт Номер байта памяти называется его адресом Адрес – это целое число, которое принято представлять в шестнадцатеричной системе счисления Диапазон адресов занимает интервал от 0 до некоторого максимального значения, определяемого архитектурой компьютера и операционной системой

Слайд 9
Описание слайда:
В дальнейшем будем полагать максимальное значение адреса равным 232 -1 В дальнейшем будем полагать максимальное значение адреса равным 232 -1 Для каждого типа данных стандартом языка С++ определяется минимально возможное количество байт, отводимое для хранения значений этого типа Такая область памяти называется ячейкой памяти Адрес ячейки памяти совпадает с адресом ее первого (младшего) байта

Слайд 10
Описание слайда:
Доступ к динамическим переменным возможен только путем непосредственного указания их адреса в оперативной памяти Доступ к динамическим переменным возможен только путем непосредственного указания их адреса в оперативной памяти Адрес динамической переменной является результатом выполнения операции new Для хранения адресов используются переменные, называемые указателями

Слайд 11
Описание слайда:
Таким образом, указатели – это переменные, хранящие адреса других программных объектов Таким образом, указатели – это переменные, хранящие адреса других программных объектов

Слайд 12
Описание слайда:
Синтаксис объявления указателя на переменную: Синтаксис объявления указателя на переменную: <тип переменной> *<имя указателя>; Указатели на константы объявляются со спецификатором const Например: float *x, *b; const int *c; Здесь объявлены два указателя x и b на переменные вещественного типа а также указатель c на целую константу

Слайд 13
Описание слайда:
Кроме того, константами могут быть сами указатели, т.е. содержать адреса, не меняющиеся в течение всего времени их существования Кроме того, константами могут быть сами указатели, т.е. содержать адреса, не меняющиеся в течение всего времени их существования Это свойство указателей устанавливается квалификатором const, записанным после символа ‘*’ в объявлении указателя, например: double *const cp; // указатель-константа на переменную const double *const cp; // указатель-константа на константу

Слайд 14
Описание слайда:
Переменная (константа), адрес которой хранится в некотором указателе, называется указанной переменной (константой) Переменная (константа), адрес которой хранится в некотором указателе, называется указанной переменной (константой) Синтаксис обращения к указанным переменным и константам: *<имя указателя> Здесь символ “*” означает унарную операцию разадресации, результатом которой является получение значения из ячейки памяти, адрес которой хранится в указателе

Слайд 15
Описание слайда:
Присваивание указателю адреса существующей переменной (константы): Присваивание указателю адреса существующей переменной (константы): int a; int *p = &a; Присваивание значения другого инициализированного указателя: int *r = p; Присваивание пустого значения: int *p = NULL; int *r = 0; Присваивание адреса памяти в явном виде int *p = (int*) 28456;

Слайд 16
Описание слайда:
В первом способе инициализации используется унарная операция получения адреса В первом способе инициализации используется унарная операция получения адреса Эта операция может применяться только к поименованным величинам; нельзя получить адрес выражения или неименованной константы Четвертый способ инициализации используется в системном программировании для доступа к ячейкам памяти специального назначения

Слайд 17
Описание слайда:
При объявлении указателя надо сразу выполнять его инициализацию При объявлении указателя надо сразу выполнять его инициализацию Непреднамеренное использование неинициализированных указателей – один из наиболее распространенных источников ошибок в программах!

Слайд 18
Описание слайда:
Динамические переменные (константы) создаются в динамической области памяти (heap – куча) Динамические переменные (константы) создаются в динамической области памяти (heap – куча) Время жизни таких переменных – от момента создания до завершения программы или до явного освобождения памяти Доступ к динамическим переменным и константам осуществляется с помощью указателей

Слайд 19
Описание слайда:
Создание динамических переменных происходит в момент выделения им места в памяти Создание динамических переменных происходит в момент выделения им места в памяти Для выполнения этой операции можно используют унарную операцию new Синтаксис операции: new <тип> [(<инициализирующее выражение>)] Например: int* m = new int; float* x = new float(56);

Слайд 20
Описание слайда:
Для удаления динамических переменных и констант с освобождением памяти используют унарную операцию delete: Для удаления динамических переменных и констант с освобождением памяти используют унарную операцию delete: delete <имя указателя> Память, отведенная под динамические объекты, автоматически освобождается, когда указатели на них выходят из области своего действия

Слайд 21
Описание слайда:
Вместо использования операций delete можно просто присваивать переменной-указателю значение NULL Вместо использования операций delete можно просто присваивать переменной-указателю значение NULL В этом случае в оперативной памяти остается неиспользуемая динамических переменная В состав операционной системы входит подсистема garbage collector («сборщик мусора»), назначением которой является автоматическое удаление из динамической памяти неиспользуемых переменных

Слайд 22
Описание слайда:
Программа «Объявление указателей» Программа «Объявление указателей» Листинг программы

Слайд 23
Описание слайда:
Синтаксис объявления Синтаксис объявления void *<имя указателя> Применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен

Слайд 24
Описание слайда:
Указателю на void можно присвоить значение указателя любого типа, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется произвести явное преобразование к нужному типу Указателю на void можно присвоить значение указателя любого типа, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется произвести явное преобразование к нужному типу Например: float a = 7; void *r = &a; cout << “*r = “ << *(float*)r << endl;

Слайд 25
Описание слайда:
Кроме четырех рассмотренных выше унарных операций (*, &, new и delete) для указателей определены четыре бинарных арифметических операции: Кроме четырех рассмотренных выше унарных операций (*, &, new и delete) для указателей определены четыре бинарных арифметических операции: инкремент, декремент, сложение с константой, вычитание Арифметические операции изменяют значения указателей

Слайд 26
Описание слайда:
Операция инкремента (декремента) увеличивает (уменьшает) значение указателя, связанного с некоторым типом, на величину, равную размеру данных этого типа Операция инкремента (декремента) увеличивает (уменьшает) значение указателя, связанного с некоторым типом, на величину, равную размеру данных этого типа Операции сложения (вычитания) с константой увеличивают (уменьшают) значение указателя на величину, равную произведению константы на размер данных типа, связанного с указателем

Слайд 27
Описание слайда:
Разность двух указателей одного типа равна разности их значений, деленной на размер данных связанного с ними типа Разность двух указателей одного типа равна разности их значений, деленной на размер данных связанного с ними типа Суммирование двух указателей не допускается Например для указателей p и q: int *p = new int, *q = new int; разность p – q будет иметь значение в 4 раза меньшее разности их значений Листинг программы

Слайд 28
Описание слайда:
В языке C++ указатели играют очень важную роль, обеспечивая ряд особенностей в работе с массивами и строками, которые отсутствуют в алголоподобных языках типа Pascal В языке C++ указатели играют очень важную роль, обеспечивая ряд особенностей в работе с массивами и строками, которые отсутствуют в алголоподобных языках типа Pascal

Слайд 29
Описание слайда:
В языках C и C++ существует тесная связь между массивами и указателями – имя массива фактически является указателем-константой, инициализированным адресом начального элемента массива В языках C и C++ существует тесная связь между массивами и указателями – имя массива фактически является указателем-константой, инициализированным адресом начального элемента массива Поэтому возможна следующая инициализация указателя: float a[10]; float* p = a; без выполнения операция получения адреса, примененной к имени массива (&a)

Слайд 30
Описание слайда:
Для обращения к элементам массива можно использовать операции адресной арифметики Для обращения к элементам массива можно использовать операции адресной арифметики Например, присваивание float x = *(a + i); эквивалентно float x = a[i]; Пример использования имени массива как указателя Выполнение программы

Слайд 31
Описание слайда:
Использование указателей позволяет создавать массивы, размер которых определяется уже в процессе выполнения программы Использование указателей позволяет создавать массивы, размер которых определяется уже в процессе выполнения программы Такие массивы принято называть динамическими Однако следует иметь в виду, что будучи однажды заданным размер динамического массива уже не может быть изменен

Слайд 32
Описание слайда:
Для создания динамического массива необходимо объявить указатель, который будет играть роль имени массива: Для создания динамического массива необходимо объявить указатель, который будет играть роль имени массива: <тип элементов> *<имя массива> Затем делается запрос на выделение памяти для размещения массива <имя массива> = new <тип элементов> “[“<выражение целого типа>”]” Значение выражения, помещенного в квадратные скобки, и будет размером динамического массива

Слайд 33
Описание слайда:
Динамический массив не инициализируется и его элементы не обнуляются Динамический массив не инициализируется и его элементы не обнуляются Например: cin >> n; double *a = new double [n]; Освобождение памяти, выделенной под динамический массив осуществляется операцией delete [ ] <имя массива> Пример работы с динамическим массивом Листинг программы

Слайд 34
Описание слайда:
Двумерные массивы с фиксированными на этапе компиляции размерами объявляются следующим образом: Двумерные массивы с фиксированными на этапе компиляции размерами объявляются следующим образом: <тип элементов> <имя массива> “[“<размер1>”]” “[“<размер2>”]” [=“{“<список констант>”}”], где <размер1> и <размер2> – константные выражения

Слайд 35
Описание слайда:
Например: Например: const int n = 2; int a [n] [2 * n] = {{1, 3, 5, 7}, {2, 4, 6, 8}}; Здесь описан прямоугольный массив из двух строк и четырех столбцов Разбиение списка констант в инициализаторе на подсписки можно было не производить: int a [n] [2 * n] = {1, 3, 5, 7, 2, 4, 6, 8};

Слайд 36
Описание слайда:
В двумерном массиве a[i] является указателем-константой на начало i–й строки, т.е. содержит адрес элемента a[i] [0], поэтому *(a[i] + j) эквивалентно a[i] [j] В двумерном массиве a[i] является указателем-константой на начало i–й строки, т.е. содержит адрес элемента a[i] [0], поэтому *(a[i] + j) эквивалентно a[i] [j] Следовательно, двумерный массив фактически является одномерным массивом указателей на одномерные массивы Этот принцип построения распространяется на массивы любой размерности

Слайд 37
Описание слайда:

Слайд 38
Описание слайда:
Для создания динамического двумерного массива следует объявить указатель на массив указателей: Для создания динамического двумерного массива следует объявить указатель на массив указателей: <тип элементов*> *<имя массива> Далее следует запросить выделение памяти под этот массив: <имя массива> = new <тип элементов*> “[“<выражение целого типа>”]”

Слайд 39
Описание слайда:
Далее следует инициализировать каждый из элементов массива указателей: Далее следует инициализировать каждый из элементов массива указателей: <имя массива> “[“<индексное выражение>”]”= new <тип элементов>“[“< выражение целого типа>”]”

Слайд 40
Описание слайда:
Возможность задавать длину для каждой строки двумерного массива позволяет формировать массивы произвольной формы, отличной от прямоугольной Возможность задавать длину для каждой строки двумерного массива позволяет формировать массивы произвольной формы, отличной от прямоугольной Такие массивы называются зубчатыми (jagged arrays) Пример определения зубчатого массива Листинг программы Удаление многомерных динамических массивов также производится операцией delete [ ]

Слайд 41
Описание слайда:

Слайд 42
Описание слайда:
Логическому делению оперативной памяти на статическую, автоматическую и динамическую соответствует деление физической памяти на несколько участков, называемых сегментами Логическому делению оперативной памяти на статическую, автоматическую и динамическую соответствует деление физической памяти на несколько участков, называемых сегментами Сегментная структура физической памяти обеспечивает, кроме того, раздельное хранение программ и данных

Слайд 43
Описание слайда:

Слайд 44
Описание слайда:
Коды функций размещаются в сегменте команд CS Коды функций размещаются в сегменте команд CS Статические переменные размещаются в сегменте данных DS Автоматические переменные размещаются в сегменте стека SS Динамические переменные размещаются в дополнительном сегменте данных ES

Слайд 45
Описание слайда:
Указатели могут использоваться для доступа как к статическим (поименованным), так и к динамическим (непоименованным) объектам Указатели могут использоваться для доступа как к статическим (поименованным), так и к динамическим (непоименованным) объектам Обращение к самим указателям осуществляется по имени, также как к другим статическим переменным В языке C++ различают три вида указателей: указатели на переменные, указатели на функции, void-указатели

Слайд 46
Описание слайда:
Пример работы со строками через указатели Пример работы со строками через указатели Листинг программы


Скачать презентацию на тему Указатели. Лекция 5. Виды оперативной памяти можно ниже:

Похожие презентации