Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

3.1.2. Динамическое размещение одномерного массива

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

double *data; // указатель на массив

data=new double[1000]; // указатель на 0-й элемент массива

// инициализация

// после размещения в массиве "мусор" и сразу обязательно инициализировать все его элементы

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

{

data[i]=0.;

}

delete [] data; // обязательно освободить память

data+1; // указатель на 1-й элемент

data+100; // указатель на 100-й элемент,

*(data+4); // эквивалентно data[4]

3.1.3. Передача массива в функцию (пример 3.1)

Передача массива в функцию может осуществляться только по указателю на нулевой элемент, с дополнительной информацией о количестве элементов в массиве:

/////////////////////////////////////////////////////////////////////////////

// Прикладное программирование

// Пример 3.1. Пример работы с динамическим одномерным массивом

//

// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru

// СПб НИУ ИТМО

/////////////////////////////////////////////////////////////////////////////

// подключение библиотеки ввода-вывода

#include <iostream>

// подключение стандартного пространства имен для использования библиотек

using namespace std;

// прототипы функций

double sum(double data[], int n);

/////////////////////////////////////////////////////////////////////////////

// пример передачи массива в функцию

// функция вычисляет сумму всех элементов массива

// data - массив (указатель на 0-й элемент массива)

// n - количество элементов в массиве

double sum(double data[], int n)

{

double sum=0.;

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

{

sum+=data[i];

}

return sum;

}

/////////////////////////////////////////////////////////////////////////////

void main()

{

// объявление указателя на массив

double *data;

int count=1000; // количество элементов в массиве

// динамическое размещение массива, data - указатель на 0-й элемент массива

data=new double[count];

// вывод 10 элементов массива до инициализации (в массиве "мусор")

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

{

cout<<data[i]<<endl;

}

cout<<"-----------------"<<endl;

// инициализация массива

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

{

data[i]=i;

}

// вывод 10 элементов массива после инициализации

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

{

cout<<data[i]<<endl;

}

cout<<"-----------------"<<endl;

cout<<data<<endl; // указатель на 0-й элемент

cout<<data+1<<endl; // указатель на 1-й элемент

cout<<*(data+4)<<endl; // эквивалентно data[4]

cout<<data[count-1]<<endl; // последний элемент массива

cout<<"-----------------"<<endl;

// пример передачи массива в функцию

cout<<sum(data, count)<<endl;

cout<<sum(&data[0], count)<<endl;

cout<<"-----------------"<<endl;

delete [] data; // обязательно освободить память

cout<<data[4]<<endl; // ОШИБКА! ссылка на уже несуществующий элемент массива

}

/////////////////////////////////////////////////////////////////////////////