Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




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

Указатель представляет собой адрес памяти, который указывает (или ссылается) на определенный участок. Для определения указателя используется символ * в определении или объявлении объекта. Синтаксис определения указателя имеет вид:

 

класс_хранения спецификация_типа *идентификатор;

 

Символ * в этом контексте означает "указатель на". Несколько примеров:

int *iptr; //Определяет указатель на целое значение

float *fvals; //Определяет указатель на значение с плавающей точкой

char *cp; //Описывает указатель на символ

 

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

 

указатель = new имя_типа[инициализатор];

 

где инициализатор – выражение в круглых скобках.

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

 

int* x=new int(5);

 

Для удаления динамических переменных используется операция delete, определенная в C++:

delete указатель;

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

delete x;

 

Операция new при использовании с массивами имеет следующий формат:

 

new тип_массива

 

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

Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной), например:

 

char *buffer = new char[50];

 

int nstr = 5;

int * * m = (int **) new int [nstr][10];

 

При формированиb матрицы сначала выделяется память для массива указателей на одномерные массивы, а затем в цикле с параметром выделяется память под n одномерных массивов.

 

Пример создания динамического двумерного массива

 

#include<iostream.h>

#include<conio.h>

int i,j,m,n;

 

cout <<”Введите количество строк n= ";

cin >>n;

cout << " Введите количество столбцов m = ";

cin>>m;

srand(time(NULL));

int **a;

a = new int* [n]; //выделение памяти по массив указателей

srand(time(NULL));

for(int i=0;i<n;i++) a[i] = new int[m]; //выделение памяти для массива значений

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

{

for(int j=0;j<m;j++)

{

a[i][j] = rand()%10;

cout<<a[i][j]<<"\t";

}

cout << "\n";

}

getch();

 

}

 

Рис. Выделение памяти под двумерный массив

 

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

 

delete[] a; /*освобождает память, выделенную под массив, если а адресует его начало*/

 

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

Если пропустить пару пустых квадратных скобок, произойдет серьезная ошибка, кото­рую компилятор, вероятнее всего, не заметит, а, следовательно, она проявится во вре­мя выполнения.

Наименее серьезным последствием пропуска пары квадратных скобок при осво­бождении массива, будет освобождение во время выполнения не всей занятой мас­сивом памяти, что приведет к ее утечке (memory leak). Однако на некоторых систе­мах или при использовании элементов некоторых типов возможны гораздо более серьезные проблемы. Поэтому при удалении указателей на массивы очень важно не забывать о квадратных скобках.

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

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

 

a = new double; // Одна переменная

d = new double[4]; // Массив переменных

dd = new double*[3]; // Двухмерный массив

...

// Освобождение памяти

delete a; // Одна переменная

delete [] d; // Массив переменных

for(int i = 0; i < 3; i++) // Двухмерный массив

delete [] dd[i];

delete [] dd;

 

Постановка задачи

1. Сформировать динамический одномерный массив, заполнить его случайными числами и вывести на печать.

2. Выполнить указанное в варианте задание и вывести полученный массив на печать.

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

4. Выполнить указанное в варианте задание и вывести полученный массив на печать.

Для выделения памяти, заполнения массивов, удаления и добавления элементов (строк, столбцов) написать отдельные функции. В функции main() должны быть размещены только описания переменных и обращения к соответствующим функциям

Варианты

№ варианта Одномерный массив Двумерный массив
  Удалить первый четный элемент Добавить строку с заданным номером
  Удалить первый отрицательный элемент Добавить столбец с заданным номером
  Удалить элемент с заданным ключом (значением) Добавить строку в конец матрицы
  Удалить элемент равный среднему арифметическому элементов массива Добавить столбец в конец матрицы
  Удалить элемент с заданным номером Добавить строку в начало матрицы
  Удалить N элементов, начиная с номера K Добавить столбец в начало матрицы
  Удалить все четные элементы Добавить К строк в конец матрицы
  Удалить все элементы с четными индексами Добавить К столбцов в конец матрицы
  Удалить все нечетные элементы Добавить К строк в начало матрицы
  Удалить все элементы с нечетными индексами Добавить К столбцов в начало матрицы
  Добавить элемент в начало массива Удалить строку с номером К
  Добавить элемент в конец массива Удалить столбец с номером К
  Добавить К элементов в начало массива Удалить строки, начиная со строки К1 и до строки К2
  Добавить К элементов в конец массива Удалить столбцы, начиная со столбца К1 и до столбца К2
  Добавить К элементов, начиная с номера N Удалить все четные строки
  Добавить после каждого отрицательного элемента его модуль Удалить все четные столбцы
  Добавить после каждого четного элемента элемент со значением 0 Удалить все строки, в которых есть хотя бы один нулевой элемент
  Добавить по К элементов в начало и в конец массива Удалить все столбцы, в которых есть хотя бы один нулевой элемент
  Добавить элемент с номером К Удалить строку, в которой находится наибольший элемент матрицы
  Удалить элемент с заданным номером Добавить строки после каждой четной строки матрицы

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных