11 Масиви та вказівники
Масиви та вказівники
Переваги використання покажчиків при роботі з елементами масиву
Вихід за межі масиву
Відзначимо ще одну важливий аспект роботи з С-масивами в С ++. У мові С ++ відсутній контроль дотримання виходу за межі С-масиву. Т. о. відповідальність за дотримання режиму обробки елементів в межах кордонів масиву лежить цілком на розробника алгоритму. Розглянемо приклад.
програма 11.4
Програма виведе приблизно наступне:
У програмі 11.4 навмисне допущена помилка. Але компілятор повідомить про помилку: в масиві оголошено п'ять елементів, а в циклах мається на увазі, що елементів 10! У підсумку, правильно проініціалізовані будуть тільки п'ять елементів (далі може призвести до пошкодження даних), вони ж і будуть виведені разом з "сміттям". С ++ надає можливість контролю кордонів за допомогою бібліотечних функцій begin () і end () (необхідно підключити заголовний файл iterator). Модифікуємо програму 11.4
програма 11.5
Функції begin () і end () повертають ітератори. Поняття ітераторів ми розкриємо пізніше, а поки скажемо, що вони поводяться як покажчики, що вказують на перший елемент (first) і елемент, що настає за останнім (last). У програмі 11.5 ми, для компактності і зручності, замінили цикл for на while (оскільки лічильник нам вже тут не потрібен - ми використовуємо арифметику покажчиків). Маючи два покажчика ми легко можемо сформулювати умова виходу з циклу, так як на кожному кроці циклу покажчик first инкрементируется.
Ще одним способом зробити обхід елементів масиву більш безпечним заснований на застосуванні циклу range-based for. згаданого нами в темі Інструкція циклу з параметром for (див. програму 9.3)
Операції new і delete
До моменту знайомства з покажчиками вам був відомий єдиний спосіб запису змінюваних даних в пам'ять за допомогою змінних. Змінна - це пойменована область пам'яті. Блоки пам'яті для відповідних змінних виділяються в момент запуску програми і використовуються до припинення її роботи. За допомогою покажчиків можна створювати неіменовані блоки пам'яті певного типу і розміру (а також звільняти їх) в процесі роботи самої програми. В цьому проявляється чудова особливість покажчиків, найбільш повно розкривається в об'єктно-орієнтованому програмуванні при створенні класів.
Динамічне виділення пам'яті здійснюється за допомогою операції new. синтаксис:
Після виконання роботи з виділеною пам'яттю її необхідно звільнити (повернути, зробити доступною для інших даних) за допомогою операції delete. Контроль над витрачанням пам'яті - важлива сторона розробки додатків. Помилки, при яких пам'ять не звільняється, призводять до "витоків пам'яті", що, в свою чергу, може привести до аварійного завершення програми. Операція delete може застосовуватися до нульового вказівником (nullptr) або створеному за допомогою new (т. О. New і delete використовуються в парі).
динамічні масиви
Динамічний масив - це масив, розмір якого визначається в процесі роботи програми. Строго кажучи C-масив не є динамічним в C ++. Тобто, можна визначати тільки розмір масиву, а зміна розміру масиву, в процесі роботи програми, як і раніше неможливо. Для отримання масиву потрібного розміру необхідно виділяти пам'ять під новий масив і копіювати в нього дані з вихідного, а потім звільняти пам'ять виділену раніше під вихідний масив. Справді динамічним масивом в C ++ є тип vector. який ми розглянемо пізніше. Для виділення пам'яті під масив використовується операція new. Синтаксис виділення пам'яті для масиву має вигляд:
покажчик = new тип [розмір]. наприклад:
Звільнення пам'яті проводиться за допомогою оператора delete:
При цьому розмір масиву не вказується.
Приклад програми. Заповнити динамічний цілочисельний масив arr1 випадковими числами. Показати вихідний масив. Переписати в новий динамічний цілочисельний масив arr2 всі елементи з непарними порядковими номерами (1, 3.). Вивести вміст масиву arr2.
програма 11.7
Ми знаємо, що в C ++ двовимірний масив являє собою масив масивів. Отже, для створення двовимірного динамічного масиву необхідно виділяти пам'ять в циклі для кожного, хто входить масиву, попередньо визначивши кількість створюваних масивів. Для цього використовується покажчик на покажчик. іншими словами опис масиву покажчиків:
де m - кількість таких масивів (рядків двовимірного масиву).
Приклад завдання. Заповнити випадковими числами і вивести елементи двовимірного динамічного масиву.
програма 11.8
- У чому полягає зв'язок покажчиків і масивів?
- Чому використання покажчиків при переборі елементів масиву більш ефективно, ніж використання операції звернення за індексом []?
- У чому суть поняття "витік пам'яті"?
- Перерахуйте способи попередження виходу за межі масиву?
- Що таке динамічний масив? Чому в С ++ С-масив не є динамічним по суті?
- Опишіть процес створення динамічного двовимірного масиву
Презентація до уроку
Домашнє завдання
Використовуючи динамічні масиви вирішити наступне завдання: Дан цілочисельний масив A розміру N. Переписати в новий цілочисельний масив B всі парні числа з вихідного масиву (в тому ж порядку) і вивести розмір отриманого масиву B і його вміст.
§62 (10) §40 (11)