Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСП_ЛЕК-1.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
415.74 Кб
Скачать

3. Масиви та вказівники

За допомогою комбінацій зірочок, круглих і квадратних дужок можна описувати складені типи й покажчики на складені типи, наприклад, в операторі

int *(*p[10])();

оголошується масив з 10 покажчиків на функції без параметрів, що повертають покажчики на int.

За замовчуванням квадратні й круглі дужки мають однаковий пріоритет, більший, ніж зірочка, і розглядаються ліворуч на право. Для зміни порядку розгляди використаються круглі дужки.

При інтерпретації складних описів необхідно дотримуватися правила «зсередини назовні»:

  1. якщо праворуч від імені є квадратні дужки, це масив, якщо дужки круглі - це функція;

  2. якщо ліворуч є зірочка, це покажчик на проінтерпретовану раніше конструкцію;

  3. якщо праворуч зустрічається закриваюча дужка, необхідно застосувати наведені вище правила усередині дужок, а потім переходити назовні;

  4. в останню чергу інтерпретується специфікатор типу.

Для наведеного вище опису порядок інтерпретації зазначений цифрами:

int *(*p[10]) ();

5 4 2 1 3 //порядок інтерпретації опису

___________________________________________________________________

  1. Динамічні масиви.

Динамічні масиви.

Виділення ділянки динамічної пам'яті (і присвоювання її адреси покажчику) можна здійснити такими способами:

  • за допомогою операції new:

int * n=new int; //1

int * m=new int (10); //2

int * q=new int [10]; //3

  • c допомогою функції malloc:

int * u=(int *)malloc(sizeof(int)); //4

В операторі 1 операція new виконує виділення достатнього для розміщення величини типу int ділянки динамічної пам'яті й записує адресу початку цієї ділянки в змінну n. Пам'ять під саму змінну n (розміру, достатнього для розміщення покажчика) виділяється на етапі компіляції.

В операторі 2, крім описаних вище дій, виробляється ініціалізація виділеної динамічної пам'яті значенням 10.

В операторі 3 операція new виконує виділення пам'яті під 10 величин типу int (масиву з 10 елементів) і записує адресу початку цієї ділянки в змінну q, що може трактуватися як ім'я масиву. Через ім'я можна звертатися до будь-якого елемента масиву.

Якщо пам'ять виділити не вдалося, по стандарті повинне породжуватися виключення bad_alloc. Старі версії компіляторів можуть повертати 0.

В операторі 4 робиться те ж саме, що й в операторі 1, але за допомогою функції виділення пам'яті malloc, успадкованої з бібліотеки С. У функцію передається один параметр - кількість виділюваної пам'яті в байтах. Конструкція (int) використається для приведення типу покажчика, що повертає функцією, до необхідного типу. Якщо пам'ять виділити не вдалося, функція повертає 0.

Операцію new використати переважніше, ніж функцію malloc, особливо при роботі з об'єктами.

Звільнення пам'яті, виділеної за допомогою операції new, повинне виконуватися за допомогою delete, а пам'яті, виділеною функцією malloc - за допомогою функції free. При цьому змінн-покажчик зберігається й може ініціалізуватися повторно. Наведені вище динамічні змінні знищуються в такий спосіб:

delete n; delete m; delete [] q; free (u);

Якщо пам'ять виділялася за допомогою new [], для звільнення пам'яті необхідно застосовувати delete []. Розмірність масиву при цьому не вказується. Якщо квадратних дужок ні, то ніякого повідомлення про помилку не видається, але позначений як вільний буде тільки перший елемент масиву, а інші виявляться недоступні для подальших операцій. Такі комірки пам'яті називаються сміттям.