4.Реферат презентації
Масив - кінцева послідовність однотипних величин, що має загальне ім'я.
Аналог поняття масиву - вектор.
Формат опису масиву:
тип ім'я_змінної [розмір];
тип - тип елементів, що зберігаються в масиві;
ім'я_змінної - назва масиву;
Елементи масиву розташовуються в пам'яті послідовно.
Всі елементи масиву нумеруються з 0 до розміру масиву мінус 1
приклад
int mas [5];
Елементи масиву розташовуються в пам'яті послідовно - один за іншим.
Доступ до елемента масиву здійснюється за його номером (індексом).
Динамiчна пам’ять - Це вільна пам’ять, у якій під час виконання програми можна виділяти місце залежно від потреб користувача. Доступ до виділених ділянок динамічної пам'яті, що називаються динамічними змінними, здійснюється тільки через покажчики.
У мові C++ застосовують два способи роботи з динамічною пам’яттю. Перший з них дістався в спадщину від мови С і використовує сукупність функцій malloc(), другий — працює з операціями new та delete, які здійснюють динамічний розподіл і скасування з вищим пріоритетом, ніж інші функції.
Динамічні масиви - Динамічні масиви створюють за допомогою операції new, при цьому необхідно вказати їх тип і розмірність. Наприклад, Для одновимірного масиву дійсних чисел, що має 100 елементів, треба записати:
int n = 100; .
Динамічним називають такий масив, розмір якого можна змінювати під час виконання програми. Динамічні масиви надають змогу більш гнучко працювати з даними, оскільки дозволяють вводити довільний розмір. Для зміни розміру динамічного масиву мова програмування, що підтримує такі масиви, повинна надавати вбудовану функцію чи оператор. В порівняні зі статичним масивом, динамічний не має фіксованого розміру та може задаватись під час виконання програми. Замість використання змінної типу string можна використовувати масив змінних типу char.
Якщо після імені типу в операції new розташувати квадратні дужки з цілим значенням всередині, в динамічній пам'яті можна розмістити масив відповідного типу. Ціле значення в квадратних дужках - це кількість елементів, для визначення якої можна використовувати будь-які вирази або змінні, щ приводяться до int. Після створення, використання динамічних масивів і звичайних масивів практично не відрізняються
Динамически распределяемую память следует использовать в случае если мы заранее (на момент написания программы) не знаем сколько памяти нам понадобится (например, размер массива зависит от того, что введет пользователь во время работы программы) и при работе с большими объемами данных (например, массив из 1 000 000 int`ов не поместится на стеке).
Для работы с динамической памятью в языке С используются следующие функции: malloc, calloc, free, realloc. Рассмотрим их подробнее.
void *malloc(size_t size);
В качестве входного параметра функция принимает размер памяти, которую требуется выделить. Возвращаемым значением является указатель на выделенный в куче участок памяти. Для выделения памяти под 1 000 000 int`ов необходимо выполнить следующий код: int * p = malloc(1000000*sizeof(int));
В языке С++ потребуется небольшая модификация данной кода (из-за того, что в С++ нет неявного приведения указателей): int * p = (int *) malloc(1000000*sizeof(int));
Если ОС не смогла выделить память (например, памяти не хватило), то malloc возвращает 0. После окончания работы с выделенной динамически памятью нужно освободить ее. Для этой цели используется функция free, которая возвращает память под управление ОС.
void free(void *ptr);
В качестве входного параметра в free нужно передать указатель, значение которого полученно из функции malloc. Вызов free на указателях полученных не из malloc (например, free(p+10)) приведет к неопределенному поведению. Это связанно с тем, что при выделении памяти при помощи malloc в ячейки перед той, на которую указывает возвращаемый функцией указатель операционная система записывает служебную информацию (см. рис.). При вызове free(p+10) информация находящаяся перед ячейкой (p+10) будет трактоваться как служебная. void *calloc(size_t nmemb, size_t size);
Функция работает аналогично malloc, но отличается синтаксисом (вместо размера выделяемой памяти нужно задать количество элементов и размер одного элемента) и тем, что выделенная память будет обнулена. Например, после выполнения int * q = (int *) calloc(1000000, sizeof(int)) q будет указывать на начало массива из миллиона int`ов инициализированных нулями.
void *realloc(void *ptr, size_t size);
Функция изменяет размер выделенной памяти (на которую указывает ptr, полученный из вызова malloc, calloc или realloc). Если размер указанный в параметре size больше, чем тот, который был выделен под указатель ptr, то проверяется, есть ли возможность выделить недостающие ячейки памяти подряд с уже выделенными. Если места недостаточно, то выделяется новый участок памяти размером size и данные по указателю ptr копируются в начало нового участка.
Если размер объекта или массива заранее неизвестен (например, изображение), или размер объекта слишком большой, чтобы создавать его внутри функции, значит настало время воспользоваться механизмом динамической памяти С++, использующую отдельную область памяти называемой кучей.
Двумерный массив - это массив одномерных массивов. Двумерный массив объявляется следующим образом: тип имя_массива[размер второго измерения][размер первого измерения]; Следовательно, для объявления двумерного массива целых с размером 10 на 20 следует написать: int d[10] [20] ;
Двумерные массивы сохраняются в виде матрицы, где первый индекс отвечает за строку, а второй -за столбец. Это означает, что правый индекс изменяется быстрее левого, если двигаться по массиву в порядке расположения элементов в памяти. На рис. показано графическое представление двумерного массива в памяти. Левый индекс можно рассматривать как указатель на строку.
Когда двумерный массив используется как аргумент функции, передается указатель на первый элемент. Функция, получающая двумерный массив, должна, как минимум, определять размер первого измерения, поскольку компилятору необходимо знать длину каждой строки для корректной индексации массива.
