Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПСД программы (полн).doc
Скачиваний:
1
Добавлен:
17.04.2019
Размер:
289.79 Кб
Скачать

Статические и динамические массивы

При объявлении переменной типа массив размер массива должен быть задан целочисленной константой. Если количество элементов заранее не известно, то размер выбирается в расчете на максимально возможное для конкретной задачи количество элементов, что не всегда эффективно.

Память для массива распределяется статически на этапе трансляции (до выполнения программы), такие массивы называются статическими. В явном виде в языке С/С++ можно использовать только статические массивы.

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

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

<тип> *<имя>, например int * adr,

тогда переменная adr – указатель (ссылка) на целочисленную величину.

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

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

Пример создания динамического массива с помощью операции new:

int n;

float *z; // указатель (ссылка)

cin >> n;

z = new float [n]; // выделение памяти

if (z == NULL) { cout<< “No memory”; return 1;} // ошибка

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

cin >> z[i];

….

delete [] z; // освобождение памяти

return 0; // успешное завершение

Пояснения к фрагменту программы.

1. Объявляется целочисленная величина int n - количество элементов массива, значение которой будет введено во время выполнения программы: cin >> n;

2. Объявляется указатель на вещественную величину: float *z;

3. Операция new выделяет память для n вещественных чисел и возвращает начальный адрес выделенной памяти, который присваивается указателю z. Результат операции проверяется: в случае получения пустого указателя программа завершается.

3. Доступ к элементам динамического массива такой же, как к элементам статического массива. Например, к элементу с номером i в массиве z можно обратиться как z[i] или с помощью указателей *(z + i) (к начальному адресу прибавлено смещение элемента i).

Другой способ динамического выделения и освобождения памяти – использование стандартных функций управления памятью malloc и free (и их разновидностей).

Пример создания динамического массива с помощью функции malloc:

int n;

int *m; // указатель (ссылка)

cin >> n;

m = (int *) malloc ( n * sizeof(int)); // выделение памяти

if (m == NULL) { cout<< “No memory”; return 1;} // ошибка

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

cin >> m[i];

….

free (m); // освобождение памяти

return 0; // успешное завершение

Пояснения к фрагменту программы.

1. Функция malloc() выделяет участок памяти, размер которого в байтах задан в виде параметра, и возвращает в качестве значения указатель (адрес) на начало выделенного участка. Если не оказалось свободной памяти заданного размера, возвращает пустой указатель NULL.

2. Значение операции sizeof (тип) равно количеству байтов, необходимых для хранения величины указанного типа.

3. Перед вызовом функции malloc записана операция преобразования типа (int *). Функция malloc возвращает указатель типа void *, поэтому в примере требуется преобразование к типу указатель на целую величину.

Память, выделенная под динамический массив, должна быть освобождена перед завершением программы. Память, выделенная с помощью операции new [], освобождается оператором delete[], а память выделенная вызовом функции malloc() - вызовом функции free().

Функция free освобождает участок памяти (выделенный ранее функцией malloc), указатель (адрес) которого является ее параметром.

delete[] z; free (m);