- •1. Краткие теоретические сведения
- •1.1. Понятие указателя
- •1.2. Объявление указателя
- •1.3. Операции над указателями
- •1.4. Передача параметра по ссылке
- •1.5. Динамическое выделение памяти
- •1.5.1. Динамическое размещение одномерного массива
- •1.5.2. Динамическое размещение двухмерного массива
- •1.5.3. Динамические массивы
- •1.5.4. Формирование динамических массивов с использованием библиотечных функций
- •1.5.5. Формирование динамических массивов с использованием операций new и delete
- •1.5.6. Динамические массивы
- •1.5.7. Динамические массивы
- •1.5.8. Динамические массивы
- •1.5.9. Освобождение выделенной динамической памяти.
- •1.5.10. Описание динамической строки
- •1.5.11. Объявление динамического массива
- •1.6. Связь указателей и массивов
- •1.7. Массивы указателей
- •1.8. Массивы и функции
- •1.9. Указатель на символьную строку
- •Второй пример
- •Увеличение указателя на символьную строку
- •Уменьшение количества операторов
- •Сканирование символьной строки
- •1.10. Заполнение массивов случайными числами
- •1.12. Примеры программирования задач
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Динамические одномерные массивы
- •2.4.1.1. Варианты заданий
- •2.4.1.2. Пример обработки динамического массива для варианта 30
- •2.4.1.3. Программа
- •Int *a, *b; // указатели исходных одномерных массивов a и b
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Динамические двумерных массивы
- •2.4.2.1. Варианты заданий
- •2.4.2.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Динамические одномерные массивы Викентьева
- •2.4.3.1. Варианты заданий
- •2.4.4.1. Варианты заданий
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие указателя 2
1.5.9. Освобождение выделенной динамической памяти.
Динамическая память освобождается с помощью операции delete[] имя массива, например, для одномерного массива, delete[]a; Освобождение памяти, выделенной для двумерного массива b, выглядит следующим образом:
for (i=0; i<n; i++)
delete [ ] b[i];
delete [ ] b;
Время "жизни" динамического массива определяется с момента выделения динамической памяти до момента ее освобождения.
1. Алгоритмы обработки двумерных массивов
Примечание. Ввод-вывод динамической матрицы отличается от ввода-вывода статической матрицы лишь описанием матрицы.
1.5.10. Описание динамической строки
Для размещения строки в динамической памяти, необходимо описать указатель на Char, а затем выделить память с помощью new или malloc (new предпочтительнее).
Например,
char *S3=new char[m]; //m должно быть уже определено
Или
char *S3;
S3=new char[m];
Примечание. Динамические строки, как и другие массивы, нельзя инициализировать.
Например, оператор,
сhar *S4="На нуль делить нельзя";
Создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно. S4 – адрес первого символа строковой константы.
1.5.11. Объявление динамического массива
Массивы, создаваемые в динамической памяти, будем называть динамическими (размерность становится известна в процессе выполнения программы). При описании массива после имени в квадратных скобках задается количество его элементов (размерность), например int a[10]. Размерность массива может быть задана только константой или константным выражением.
При описании массив можно инициализировать, то есть присвоить его элементам начальные значения, например:
int а[10] = {1, 1, 2, 2, 5, 100};
Если инициализирующих значений меньше, чем элементов в массиве, остаток массива обнуляется, если больше — лишние значения не используются. Элементы массивов нумеруются с нуля, поэтому максимальный номер элемента всегда на единицу меньше размерности. Номер элемента указывается после его имени в квадратных скобках, например, а[0], а[3].
Если до начала работы программы неизвестно, сколько в массиве элементов, в программе следует использовать динамические массивы. Память под них выделяется с помощью операции new или функции malloc в динамической области памяти во время выполнения программы. Адрес начала массива хранится в переменной, называемой указателем. Например:
int n = 10;
int *mass1 = new int[n];
Во второй строке описан указатель на целую величину, которому присваивается адрес начала непрерывной области динамической памяти, выделенной с помощью операции new. Выделяется столько памяти, сколько необходимо для хранения n величин типа int. Величина n может быть переменной. Инициализировать динамический массив нельзя.
Обращение к элементу динамического массива осуществляется так же, как и к элементу обычного. Если динамический массив в какой-то момент работы программы перестает быть нужным и мы собираемся впоследствии использовать эту память повторно, необходимо освободить ее с помощью операции delete[], например: delete [] a; (размерность массива при этом не указывается).
delete[] mass1;
При необходимости создания многомерных динамических массивов сначала необходимо с помощью операции new выделить память под n указателей (вектор, элемент которого - указатель), при этом все указатели располагаются в памяти последовательно друг за другом. После этого необходимо в цикле каждому указателю присвоить адрес выделенной области памяти размером, равным второй границе массива
mass2=new int*[row]; // mass2 - указатель на массив указателей на одно
//мерные массивы
for(i=0;i<row;i++)
mass2[i]=new int[col]; // каждый элемент массива
//указывает на одномерный
for (i=0; i<row;i++)
for (j=0;j<col;j++)
Освобождение памяти от двумерного динамического массива:
for(i=0;i<row;i++) //удаление всех одномерных
delete[] mass2[i]; // массивов
delete[] mass2; // удаление массива указателей на одномерные массивы