Массивы указателей. Двумерные динамические массивы
Гибкость семейства языков программирования, относимых к С++ позволяет организовать хранение многомерных массивов данных многими способами. Рассмотрим способ, основанный на выделении динамической памяти под матрицу в виде указателя **Name на массив указателей, содержащий адреса строк (или столбцы) матрицы. Этот способ выделения памяти под двумерный массив состоит из двух этапов – сперва формируется массив указателей на строки (или столбцы) матрицы, а затем в цикле создаются одномерные массивы для хранения переменных заданного типа (Рис. 19), память под которые так же выделяется динамически:
Рис. 19. Расположение двумерного массива в динамической памяти Например:
При таком способе выделения памяти переменная dd фактически представляет собой «указатель на указатель на ячейку типа double». Команда dd= new double[N] создает массив указателей, каждая ячейка которого представляет собой адрес одного из N одномерных массивов dd[i], предназначенных для хранения собственно значений матрицы. На начальном этапе массив указателей не заполнен, поэтому дальше в цикле по счетчику i от 0 до N выделяется память под одномерные массивы значений dd[i] и адреса этих массивов (их нулевой ячейки) сохраняются в соответствующих ячейках массива указателей dd.
Так как функции malloc() и calloc() возвращают нетипизированный указатель void *, то необходимо выполнять его явное преобразование в указатель объявленного типа:
Адресация элементов динамического массива такого вида осуществляется с помощью индексированного имени:
Рассмотрим присвоение значений переменной-указателю a, одномерному массиву – вектору b и двумерному массиву – матрице dd.
Удаление из динамической памяти двумерного массива осуществляется в порядке, обратном его созданию, то есть сначала освобождается память, выделенная под одномерные массивы с данными dd[i], а затем память, выделенная под одномерный массив указателей dd.
Участок памяти, выделенный ранее операцией new, освобождается при помощи операции освобождения памяти delete.
Например:
Квадратные скобки [ ] в последней строке примера означают, что освобождается память, занятая всеми элементами массива, а не только первым. (!) Необходимо четко представлять себе, что удаление памяти, выделенной под массив указателей до того, как будет освобождена динамическая память массивов значений приведет к ошибке. Так как адреса массивов значений dd[i] будут утрачены, не будет возможности обратиться к массивам dd[i] для освобождения занятой ими памяти. Эта «потерянная» часть динамической памяти будет не доступна для программы пользователя и не сможет быть перераспределена диспетчером памяти операционной системы другим программам, так как она выделялась под пользовательское приложение. Это основная ошибка при работе с динамической памятью. Участок памяти, выделенный ранее операцией при помощи библиотечных функций malloc() и calloc() освобождается при помощи библиотечной функции free():
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|