Одномерные динамические массивы
Как мы уже знаем, элементы одномерного массива располагаются в памяти компьютера подряд, начиная с адреса, соответствующего началу массива. При традиционном объявлении массива компилятору должны быть чётко указаны имя массива, размер массива и тип элементов, который явно определяет размеры памяти, выделяемой под каждый элемент массива, т.е. размер памяти, выделяемый для массива, полностью и однозначно определен.
Это не всегда удобно. Иногда нужно, чтобы память для массива выделялась в таких размерах, какие нужны для решения конкретной задачи, причем размеры памяти заранее не известны.
Решить указанную проблему можно с помощью формирования массивов с переменными размерами или динамических массивов. Операция new позволяет создавать динамический массив, а операция delete освобождает ранее выделенную динамическую память.
В соответствии с синтаксисом операция new при использовании с одномерным динамическим массивом имеет следующий формат:
переменная-указатель имя_массива = new тип_массива [размер];
Например, в результате выполнения оператора
int *p = new int[6];
объявляется переменная-указательp, а затем указателю присваивается адрес выделенной области памяти для 6 элементов массива в соответствии с заданным типом массива. Если с помощью операции new невозможно выделить требуемый объём памяти, то результатом операции new является нулевое значение (0или NULL).
Динамически созданный массив может быть удален, когда работа с ним завершена. Для освобождения памяти, выделенной для динамического одномерного массива, используют операцию delete, которая имеет следующий формат:
delete [] имя_массива;
При динамическом выделении памяти для массива следует помнить, что его нельзя одновременно и инициализировать. Размер для динамического массива может быть задан во время выполнения программы. Доступ к элементам массива возможен только через указатель – p[i], *(p + i).
Пример. Динамическое выделение и освобождение памяти для одномерного массива. Размер массива вводится с клавиатуры.
…
int n;
cin>>n; // n – размер массива
int* mas = new int[n]; // выделение памяти
if(!mas){cout<<"No memory"<<endl; exit(1);}
for(int i = 0; i < 6; i++ // присваивание элементам
p[i] = i + 1; ... // массива значений 1 2 3 4 5 6
delete [] mas; // освобождение памяти
Следует отметить, что оператор
int * p = new int[n];
можно разделить на два оператора
int *p; p = new int[n];
Существенным отличием динамического массива от обычного является возможность удаления егов процессе выполнения программы.
// Пример 9.1. Память для динамического массива выделяется
// в main().Динамический массив создаётся в функции vvod()
// случайной выборкой. Выводится массив в функции vivod().
// В функции sum() вычисляется сумма элементов массива.
#include <iostream>
using namespace std;
void vvod(int*, int);
void vivod(int*, int);
int sum(int* a, int kol);
int main(){
int n;
cout<<"Vvedi kol-vo elementov massiva : "; cin>>n;
int* p = new int[n];
if(!p){cout<<"No memory"<<endl; exit(1);}
vvod(p, n);
cout<<"\n\tmain: Isxodni massiv =="<<endl;
vivod(p, n);
int y = sum(p, n);
cout<<"\n\tSumma = "<<y<<endl;
delete [] p;
system("pause");
}
void vvod(int* p, int n){
srand(n);
for(int i = 0;i < n; i++){
p[i] = rand() % 15 - rand() % 10;
}
}
void vivod(int* p, int n){
for(int i = 0; i < n; i++)
cout<<p[i]<<' '; // cout<<*(p+i)<<' ';
cout<<endl;
}
int sum(int* a, int kol){ // функция sum() вычисления суммы
int s = 0; // элементов динамического массива
for(int i = 0; i < kol; i++){
s = s + a[i];
}
return s;
}
// Пример 9.2. Память выделяется и сам массив создаётся в функции
// vvod(). Функция vvod()возвращает указатель на массив, который
// передаётся в функцию vivod(). Используется меню.
#include <iostream>
using namespace std;
void vivod(int *, int);
int* vvod(int);
int main(){
int n; int *p;
int vibor;
cout<<"vvedi kol-vo elementov massiva: "; cin>>n;
while(1){
cout<<"\n vvedite nomer punkta:\n";
cout<<"vvod---->1"<<endl
<<"vivod--->2"<<endl
<<"exit----->3"<<endl;
cin>>vibor;
switch(vibor){
case 1: system("cls"); p = vvod(n); break;
case 2: system("cls"); vivod(p, n); break;
case 3: system("cls");
cout<<"Good-Bye!"; exit(1); break;
}
}
cout<<endl;
delete [] p;
system("pause");
}
int* vvod(int n){
int *p = new int[n];
if(!p){cout<<"No memory"<<endl; exit(1);}
for(int i = 0; i < n; i++){
cout<<"vvedi a:["<<i<<"] ";
cin>>*(p + i);
}
returnp;
}
voidvivod(int *p, int n){
for(int i = 0; i < n; i++)
cout<<*(p + i )<<' '; // cout<<p[i]<<' ';
cout<<endl;
}
Дата добавления: 2022-05-27; просмотров: 81;