ТОР 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() должны быть размещены только описания переменных и обращения к соответствующим функциям Варианты
Не нашли, что искали? Воспользуйтесь поиском:
|