Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Динамические переменные и массивы





 

При написании программ часто возникает необходимость динамического выделения и освобождения памяти на этапе выполнения программы. Это позволяет использовать освобожденное пространство для других целей.

Для динамических переменных характерны следующие особенности:

1) у них нет имен, поэтому вся работа с ними осуществляется только с помощью указателя;

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

3) поскольку размер динамической памяти ограничен, то запрос на выделение памяти не всегда удовлетворяется и программист обязан за этим следить.

Оператор new выделяет память требуемого размера и возвращает адрес начала выделенного участка памяти, который присваивается указателю соответствующего типа. Если память не может быть выделена, то возвращается нулевой адрес. Поэтому перед началом работы с динамической памятью проверяется значение указателя. Если в нем хранится нулевой адрес, то работа соответствующей функции в программе завершается.

Пример создания и работы с динамической переменной:

 

double *Ptr; // объявление указателя

 

Ptr = new double; // выделение памяти и инициализация указателя

 

if (Ptr == NULL) // если память не выделена

{

printf(“\n Ошибка выделения памяти!”);

getch();

return; // выход из функции, которая

} // использует динамическую память

 

*Ptr = 1.23456; // работа с динамической переменной

 

По окончании работы с динамической переменной она должна быть удалена с помощью операции delete.

delete Ptr; // освободить память, адрес которой хранится в указателе Ptr

Удаление динамической переменной не означает, что память очищается, это означает только то, что ранее занятая память становится доступной для повторного выделения.

В операторе new можно использовать как стандартные типы, так и типы данных, определенные пользователем. Динамически выделять память для переменных стандартных типов невыгодно, т.к. память расходуется не только на переменные, но и на информацию о выделении памяти. Поэтому она выделяется только на большие массивы стандартных или пользовательских типов, размер которых заранее неизвестен.

Динамический одномерный массив создается следующим образом:

 

double *Ptr; // объявление указателя

int N;

 

printf(“\n Введите размер массива ”);

scanf(“%d”, &N);

 

Ptr = new double [N]; // создание динамического массива

 

if (Ptr == NULL)

{

printf(“\n Ошибка выделения памяти!”);

getch();

return;

}

 

for (int i = 0; i < N; i++)

Ptr[ i ] = i * 5; // работа с динамическим массивом

 

Для удаления динамического массива необходимо записать:

 

delete [ ] Ptr;

 

однако, возможен и такой вариант удаления:

 

delete Ptr;

 

т.к. информация о размере выделенной памяти известна.

Для обращения к элементам массива через указатель Ptr можно использовать как операцию разадресации указателя, так и операцию индексации указателя, которая более понятна и удобна в работе с массивом. Ниже приведены примеры выражений для работы с динамическим одномерным массивом:

 

Динамический массив Значение выражения Обычный массив
Ptr адрес первого элемента массива &Mas[0]
*Ptr значение первого элемента массива Mas[0]
Ptr+i адрес i -го элемента массива &Mas[i]
*(Ptr+i) значение i -го элемента массива Mas[i]
&(Ptr[i]) адрес i -го элемента массива &Mas[i]
Ptr[i] значение i -го элемента массива Mas[i]

 

Создание динамических многомерных массивов немного сложнее, т.к. их нельзя создать сразу. Так, например, динамическая матрица создается как набор отдельных строк, на каждую из которых должен быть установлен указатель. Поэтому требуется создание дополнительного массива указателей. Поскольку этот массив также расположен в динамической памяти, то на него должен быть установлен указатель на указатель, что схематично представлено на следующем рисунке.

 

 

Пример создания и обработки динамической матрицы:

 

double **Ptr; // объявление указателя на указатель

int N, M; // объявление размерности матрицы

 

printf(“\n Введите число строк ”);

scanf(“%d”, &N);

printf(“\n Введите число столбцов ”);

scanf(“%d”, &M);

 

Ptr = new double* [N]; // создание динамического массива указателей

for (int i = 0; i < N; i++)

Ptr[ i ] = new double [M]; // создание динамической матрицы (по строкам)

// и инициализация указателей на каждую строку

 

Для обращения к элементам матрицы через указатель на указатель Ptr можно использовать как операцию разадресации указателя, так и операцию индексации указателя. Ниже приведены примеры выражений для работы с динамической матрицей:

 

Динамическая матрица Значение выражения Обычная матрица
*(Ptr+i) значение i -го элемента массива указателей (адрес i -й строки матрицы) Mas[i]
Ptr[i] значение i -го элемента массива указателей (адрес i -й строки матрицы) Mas[i]
*(Ptr+i) + j адрес элемента матрицы в i -й строке i -м столбце &Mas[i][j]
*(*(Ptr+i) + j) значение элемента матрицы в i -й строке i -м столбце Mas[i][j]
&(Ptr[i][j]) адрес элемента матрицы в i -й строке i -м столбце &(Mas[i][j])
Ptr[i][j] значение элемента матрицы в i -й строке i -м столбце Mas[i][j]

 

Удаление динамической матрицы выполняется в порядке, противоположном порядку ее создания. Сначала нужно удалить саму матрицу, а затем массив указателей. Желательно также после этого инициализировать указатель Ptr нулем, чтобы он никуда не указывал. Тогда случайная попытка работы с ним не вызовет проблем.

 

for (int i = 0; i < N; i++)

delete Ptr[ i ]; // удаление динамической матрицы (по строкам)

 

delete [ ] Ptr; // delete Ptr; удаление динамического массива указателей

Ptr = NULL; // обнуление указателя (он никуда не указывает)

 







Дата добавления: 2015-08-12; просмотров: 381. Нарушение авторских прав; Мы поможем в написании вашей работы!




Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...


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


ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...


Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Психолого-педагогическая характеристика студенческой группы   Характеристика группы составляется по 407 группе очного отделения зооинженерного факультета, бакалавриата по направлению «Биология» РГАУ-МСХА имени К...

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

Устройство рабочих органов мясорубки Независимо от марки мясорубки и её технических характеристик, все они имеют принципиально одинаковые устройства...

Условия приобретения статуса индивидуального предпринимателя. В соответствии с п. 1 ст. 23 ГК РФ гражданин вправе заниматься предпринимательской деятельностью без образования юридического лица с момента государственной регистрации в качестве индивидуального предпринимателя. Каковы же условия такой регистрации и...

Седалищно-прямокишечная ямка Седалищно-прямокишечная (анальная) ямка, fossa ischiorectalis (ischioanalis) – это парное углубление в области промежности, находящееся по бокам от конечного отдела прямой кишки и седалищных бугров, заполненное жировой клетчаткой, сосудами, нервами и...

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

Studopedia.info - Студопедия - 2014-2025 год . (0.012 сек.) русская версия | украинская версия