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

  1. У чому полягає зв'язок покажчиків і масивів?
  2. Чому використання покажчиків при переборі елементів масиву більш ефективно, ніж використання операції звернення за індексом []?
  3. У чому суть поняття "витік пам'яті"?
  4. Перерахуйте способи попередження виходу за межі масиву?
  5. Що таке динамічний масив? Чому в С ++ С-масив не є динамічним по суті?
  6. Опишіть процес створення динамічного двовимірного масиву
Презентація до уроку
Домашнє завдання

Використовуючи динамічні масиви вирішити наступне завдання: Дан цілочисельний масив A розміру N. Переписати в новий цілочисельний масив B всі парні числа з вихідного масиву (в тому ж порядку) і вивести розмір отриманого масиву B і його вміст.

§62 (10) §40 (11)

література