узнать, какой адрес памяти присвоен определенной переменной. Возвращает указатель, а не литерал адреса! А адрес занимает объем памяти в зависимости от разрядности системы / исполняемого файла! • Оператор разыменования (*) позволяет получить значение по указанному адресу.
— это специальное значение, которое означает, что указатель ни на что не указывает. • Указатель, содержащий значение null, называется нулевым указателем. • Разыменование нулевого указателя ведет себя также как и разыменование указателей с мусором приведет к неожиданным результатам (undefined behaviour). Скорей всего будет сбой/крах программы.
переменные, которые содержат адреса памяти. • Используем оператор разыменования (*) для извлечения значений, хранимых по адресу памяти. • Разыменование указателя, значением которого является мусор, приведет к сбою в вашей программе. • При объявлении указателя указывайте звёздочку возле имени переменной.
с помощью указателей. 2. Указатели – единственный способ динамического выделения памяти в C++. 3. Указатели могут использоваться для передачи большого количества данных в функцию без копирования этих данных. 4. Указатели могут использоваться для передачи одной функции в качестве параметра другой функции. 5. Указатели используются для достижения полиморфизма при работе с наследованием. 6. Указатели могут использоваться для представления одной структуры/класса в другой структуре/классе, формируя, таким образом, целые цепочки.
в языке C++, который работает как псевдоним другого объекта или значения. • «Под капотом» ссылки и указатели работают идентично, т.е. ссылки реализованы через указатели.
ровно один раз во время запуска программы и сохраняется на протяжении всей работы программы. Выполняется для глобальных и статических переменных. • Автоматическое – память выделяется при входе в блок, содержащий данные переменные, и удаляется при выходе из него. Выполняется для локальных переменных и параметров функций. Статическое выделение памяти Автоматическое выделение памяти
происходит в тот момент, когда переменная создается в подпрограмме или, соответственно, уничтожается. • Их размер должен быть известен заранее, во время компиляции. Локальная переменная – непостоянный друг
случае, когда в подпрограмме необходимо завести переменную, которая сохраняется и при выходе из подпрограммы? Возможное решение Можно воспользоваться статическими переменными, если количество таких переменных известно заранее. Но крайне часто это не так.
точек, размер которого заранее неизвестен. Возможное решение Можно задать массив некоторого фиксированного размера. Однако, очень часто он не будет заполнен до конца, из-за чего будет происходить потеря памяти.
кучи. • Освобождать занимаемую переменными память можно в любом порядке (в отличие от локальных переменных из стека). • Выделение и освобождение памяти в куче происходит намного медленнее, чем в стеке. Разница между стеком и кучей
обеспечивающий выделение динамической памяти в куче. int* p = new int; Тип указателя на переменную Имя указателя Оператор new Тип динамической переменной
имён, доступ к ним возможен только через указатели на них. • Утечка памяти – ситуация, при которой в результате ошибок в программе возникают динамические переменные, на которые никакой указатель не указывает. • Мусор – недоступные динамические переменные. Пример утечки памяти
памяти, выделенной оператором new. • Динамические переменные, которые перестали использоваться надо удалять вручную вызовом delete. (в C#, например, есть так называемый «сборщик мусора») // Возвращаем память, на которую указывал p, обратно в операционную систему delete p; Оператор Имя указателя
не определён заранее и может быть задан пользователем или любым выражением, возвращающим целое число. • Операторы new и delete для динамических массивов имеют следующий вид: Операторы new и delete
длины массива, который уже был выделен. • Можно обойти это ограничение, динамически выделив новый массив, скопировав все элементы из старого массива, а затем удалив старый массив (однако этот способ подвержен ошибкам). • Можно использовать шаблонный класс vector, который позволяет менять свой размер в любой момент программы. 1 2 … n p 1 2 3 … p n + m Изменение длины динамического массива
одномерный динамический массив, длина которого равна количеству необходимых элементов. • При обращении пара индексов в двумерном массиве пересчитывается в один индекс в одномерном. Реализация первого подхода на C++
синтаксис доступа к элементам массива. • Сложнее в реализации по сравнению с первым подходом. • Позволяет задавать строки разной длины, что удобно для хранения разреженных матриц. Реализация второго подхода
в качестве итератора при прохождении по массиву/строке. 2. Объявить последовательно переменные типов int, char, bool, short, long, float, double, long double, int[]. Вывести их адреса; сравнить разности адресов с размерами переменных и внутри массива int[], выдаваемыми операцией sizeof(). 3. Написать функции для создания двумерного динамического массива, заполнения его случайными числами от 0 до 100 (с помощью функций srand() и rand()) и печати его содержимого на экран. 4. Объявите динамический массив символов, размер которого вводится пользователем. Самостоятельно заполните его. Посмотрите на адреса каждого элемента с помощью оператора &. Какую закономерность можно наблюдать? 5. Объявите динамический массив чисел, размер которого вводится пользователем. Самостоятельно заполните его. С помощью арифметики указателей выведите на экран его содержимое в обратном порядке. 6. Написать функцию, которая сравнивает два указателя и возвращает 1, если они указывают на один и тот же участок памяти, и 0 - в противном случае.
заводящую верхне-треугольную матрицу заданного порядка (он определяется во время выполнения программы; хранить в памяти, естественно, нужно только возможно ненулевые элементы, заведомые нули ниже главной диагонали хранить незачем) в соответствии со вторым подходом к двумерным динамическим массивам (возвращает int**). Написать также функцию, выдающую ссылку на заданный элемент этой матрицы по указателю на такую матрицу (типа int**) и номерам строки и столбца (номера в исходной квадратной матрице; если соответствующий элемент лежит не ниже главной диагонали, нужно выдать ссылку на ту переменную в составе двумерного динамического массива, в которой этот элемент хранится, иначе выдается ссылка на локальную статическую переменную, которая обнуляется при каждом вызове этой функции). 8. Написать функцию, которая создаëт динамическую переменную, выводит на экран сообщение о «еë создании и типе» и возвращает указатель на неë. 9. Напишите функцию быстрой сортировки реализовав свою функцию swap(), аргументами последней будут переменные будут передаваться по ссылке. 10. Напишите функцию сортировки вставками, аргументом которой выступит собственная функция сравнения.
создайте структуру из указателей, пример которой изображен на рисунке: Б) При помощи указателей выведите значение, на которое они указывают. В) Перед завершением удалите все динамические объекты.
двумерный массив и заполните его случайными числами от 10 до 50. Выведите его в консоль. Для наполнения и визуализации необходимо написать отдельные функции. На вход функции получают: • указатель на динамический массив; • количество строк; • количество столбцов. Количество строк и столбцов, вводятся пользователем через консоль.
динамический массив указателей. Размер массива определяется путем ввода через консоль. Б) Написать функцию, при необходимости расширяющую этот динамический массив без пересоздания существующего, т.е. выделяется динамически еще один массив указателей размером определенном в пункте (а). Последний элемент (указатель) первого массива должен указывать на первый элемент второго массива указателей. В) Написать функцию, применяемую после каждого динамического выделения памяти и которая присваивает новый свободный указатель из массива на только что выделенную динамически память (если в нëм не хватает места, то необходимо расширить его функцией, описанной в пункте (б)). Г) Написать функцию, которая «слушает» консоль и в зависимости от ввода (продолжать или вершить выполнение программы) принимает динамический массив значений (вводится собственноручно). Д) Написать функцию, которая в конце программы проходится по массиву таких указателей и освобождает всю выделенную ранее память.