- •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.1. Динамическое размещение одномерного массива
Минимальный набор действий, необходимых для динамического размещения одномерного массива действительных чисел размером n:
double *а;
. . .
а = new double[n]; // Захват памяти для n элементов
. . .
delete []а; // Освобождение памяти
1.5.2. Динамическое размещение двухмерного массива
Минимальный набор действий, необходимых для динамического размещения двухмерного массива действительных чисел размером nm:
int i, n, m; // n, m – размеры массива
double **a;
a = new double *[n]; // Захват памяти под указатели
for(i=0; i<n; i++) a[i] = new double [m]; // и под элементы
. . .
for(i=0; i<n; i++) delete []a[i]; // Освобождение памяти
delete []a;
Для современных компиляторов (версий старше «6») для освобождения памяти достаточно записать только delete []a;
1.5.3. Динамические массивы
При традиционном определении массива:
тип имя_массива [количество_элементов];
общее количество памяти, выделяемой под массив, задается определением и равно количество_элементов * sizeof(тип).
Но иногда бывает нужно, чтобы память под массив выделялась для решения конкретной задачи, причем ее размеры заранее не известны и не могут быть фиксированы.
Формирование массивов с переменными размерами можно организовать с помощью указателей и средств динамического распределения памяти двумя способами:
1) с использованием библиотечных функций, описанных в заголовочных файлах alloc.h и stdlib.h (стандартный Си);
2) с использованием операций new и delete (Си++).
1.5.4. Формирование динамических массивов с использованием библиотечных функций
Для выделения и освобождения динамической памяти используются функции
Функция |
Прототип и краткое описание |
malloc |
void * malloc(unsigned s) Возвращает указатель на начало области динамической памяти длиной в s байт, при неудачном завершении возвращает NULL |
calloc |
void * calloc(unsigned n, unsigned m) Возвращает указатель на начало области динамической памяти для размещения n элементов длиной по m байт каждый, при не удачном завершении возвращает NULL |
realloc |
void * realloc(void * p, unsigned s) Изменяет размер блока ранее выделенной динамической памяти до размера s байт, р-адрес начала изменяемого блока, при неудачном завершении возвращает NULL |
free |
void *free(void p) Освобождает ранее выделенный участок динамической памяти, р – адрес первого байта |
Пример 15.45
Функция для формирования одномерного динамического массива
int * make_mas(int n)
(
int *mas;
mas=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
mas[i]=random(10);
return mas;
}
Для выделения памяти используется функция malloc, параметром которой является размер выделяемого участка памяти равный n*sizeof(int). Так как функция malloc возвращает нетипизированный указатель void*, то необходимо выполнить преобразование полученного нетипизированного указателя в указатель int*.
Освободить выделенную память можно функцией
free(mas).