- •7. Указатели, массивы
- •7.1. Понятие адреса
- •7.2. Указатели
- •7.3. Арифметические операции и операции сравнения
- •7.4. Указатели и одномерные массивы
- •7.5. Возвращение функцией нескольких значений
- •7.6. Указатели на указатели
- •7.7. Массивы указателей и двумерные массивы
- •7.8. Массивы динамической памяти Одномерные динамические массивы
- •Двумерные динамические массивы
- •8. Строки
- •9. Структуры
- •9.1. Объявление структуры
- •9.2. Вложенные структуры
- •9.3. Статические массивы в структурах
- •9.4. Статический массив структур
- •9.5. Структуры и указатели
- •9.6. Динамический массив структур
- •9.7.Ссылка на структуру
- •9.8. Структуры и функции
7.8. Массивы динамической памяти Одномерные динамические массивы
При традиционном объявлении массива компилятору должен быть указан размер массива. Поэтому размер массива при его объявлении задается константой, именованной константой, а в общем случае константным выражением.
Тип ИмяМассива [Константное выражение] ;
Во многих задачах размер массива становится известным только в процессе выполнения программы. Т.е.размер массива будет определяться переменной, значение которой станет известным на этапе выполнения программы.
Решить указанную проблему можно с помощью формирования массивов динамической памяти, для чего используются указатели и операторы для динамического выделения памяти - new и delete.
В соответствии с синтаксисом оператор new при использовании с одномернам массивом имеет следующий формат:
ТипМассива* ИмяМассива = new ТипМассива[РазмерМассива];
Такой оператор позволяет при выполнении программы выделить в динамической памяти участок для размещения массива заданного размера и типа. Оператор new возвращает адрес блока динамической памят,.т.е. адрес первого элемента массива.
Существенным отличием динамически создаваемых массивов от обычных является возможность удаления динамического массива (освобождения памяти) в процессе выполнения программы. Статический локальный массив создается автоматически при запуске функции в которой он объявлен, и удаляется, когда функция прекращает свою работу. Статический глобальный массив создается при запуске программы и существует все время, исполнения программы. Таким образом, если массив не используется далее в программе, он продолжает существовать и занимать память.
Динамически созданный массив может быть удален, когда работа с ним завершена. Для освобождения ранее выделенной динамической области памяти служит оператор delete.
В соответствии с синтаксисом оператор delete при использовании с одномерным массивам имеет следующий формат:
delete [] ИмяМассива;
Пример 7.5. Дан одномерный целочисленный массив. Отсортировать массив по неубыванию методом "пузырька" или выбором наименьшего элемента. Массив и его размер ввести с клавиатуры. Основные этапы решения задачи оформить в виде функций. Использовать динамический массив.
Текст программы.
#include <iostream.h>
#include <stdlib.h>
int* Input (int);
void Output(int*, int);
void SortMin(int*, int);
void SortBubble(int*, int);
int main()
{
int n;
cout << "n=";
cin >> n;
int * A = Input(n);
if (A == NULL )
{
cout << "Error!"<<endl;
system("pause");
return 0;
}
cout << "Massiv: ";
Output(A,n);
int nsort;
cout<<"SortMin--->1"<<endl<<"SortBubble--->2"<<endl;
cin>>nsort;
switch (nsort)
{
case 1: SortMin(A,n);
break;
case 2: SortBubble(A,n);
break;
}
Output(A,n);
delete [] A;
cout << endl;
system("pause");
return 0;
}
int * Input(int n)
{
int* P = new int[n];
if ( P == NULL )
return NULL;
for(int* uk=P; uk<P+n; uk++)
*uk = rand()%10-rand()%10;
return P;
}
void Output(int* P,int n)
{
for(int* uk=P; uk<P+n; uk++)
cout<< *uk<<' ';
cout<<endl;
}
void SortMin(int* P, int n)
{
cout << "SortMin massiv: ";
for(int i=0,k=i; i<n-1; i++)
{ for(int j=i+1; j<n; j++)
if (P[j]<P[k]) k=j;
int t=P[i];
P[i]=P[k];
P[k]=t;
}
}
void SortBubble(int* P, int n)
{
cout << "SortBubble massiv: ";
int flag=1;
while(flag)
{
flag=0;
for(int j=0; j<n-1; j++)
if (P[j]>P[j+1])
{
int t=P[j];
P[j+1]=t;
flag=1;
}
}
}