С помощью оператора можно выделять память и для массивов. Вот как выглядит общий формат операции выделения памяти для одномерного массива : Переменная-указатель = new тип_переменной [размер];
Чтобы освободить память, выделенную для динамически созданного массива, используется такой формат оператора delete :
delete [] переменная_указатель
Следует отметить, что инициализировать динамический массив одновре6менно с выделением памяти нельзя.
Пример 3. Выделить память для 10 элементов массива типа double, который затем заполнить значениями от 1 до 10. Отобразить содержимое массива на экране.
Напомним, что в языке С++ имя массива – это указатель на первый элемент массива, то есть «природа» указателя и имени массива одинакова. Отсюда следует, что указатель можно индексировать, подобно массиву.
#include <iostream>
#define n 10
using namespace std;
void main()
{ double *p_m;
int i;
p_m = new double[n]; // выделяем память для 10-ти элементов массива
Следующий пример показывает, как ту же самую задачу можно решить без использования индексов. Почему следует избегать использования индексов? Дело в том, что при индексировании массива перед обращением к очередному элементу каждый раз вычисляется его адрес, путем прибавления к начальному адресу массива (имени) смещения (индекса). При использовании указателей используются операции инкремент/декремент, которые выполняются значительно быстрее, что и является решающим фактором при обработке больших объемов данных.
В примере 4 для обращения к элементам динамического массива данных используются два указателя – p_beg и p_tek. Оператор new возвращает адрес выделенной области памяти, который записывается в указатель p_beg, этот указатель служит в дальнейшем для хранения этого адреса (начало динамического массива). Для обращения к элементам массива служит «текущий» указатель p_tek.
Пример 4. Работа с динамическим массивом без использования индексов.
#include <iostream>
#define n 10
using namespace std;
void main()
{ double *p_beg,*p_tek;
int i;
// выделяем память для 10-ти элементов массива
p_beg = new double[10];
// устанавливаем «текущий» указатель на начало массива
p_tek=p_beg;
/* цикл для заполнения массива, «текущий» указатель перемещается на следующий элемент массива при каждом проходе цикла */
for(i=1 ; p_tek < p_beg+10 ; p_tek++)
*p_tek = i++;
/* снова устанавливаем «текущий» указатель на начало массива, так как после окончания цикла заполнения массива он указывает на конец массива */
p_tek=p_beg;
while(p_tek < p_beg+10) // цикл для отображения массива