Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Mova_S.doc
Скачиваний:
19
Добавлен:
23.02.2016
Размер:
1.14 Mб
Скачать

Об'єднання

Об'єднання подібне до структури, однак у кожен момент часу може використовуватися тільки один з елементів об'єднання. Тип об'єднання може задаватися в наступному виді:

union { опис елемента 1;

...

опис елемента n; };

Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Хоча доступ до цієї області пам'яті можливий з використанням кожного з елементів, елемент для цієї мети повинен вибиратися так, щоб отриманий результат не був безглуздим.

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур. Тобто за допомогою крапки (.) здійснюється прямий вибір компонентів, а за допомогою стрілки (–>) – непрямий вибір компонентів об’єднання. Тег об'єднання може бути формалізований точно так само, як і тег структури.

Об'єднання застосовуються для наступних цілей:

- ініціалізації використовуваного об'єкта пам'яті, якщо в кожен момент часу тільки один об'єкт із багатьох є активним;

- інтерпретації основного зображення об'єкта одного типу, так ніби цьому об'єкту був присвоєний інший тип.

Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найдовшого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити невикористовувану пам'ять. Всі елементи об'єднання зберігаються в одній і тій же області пам'яті, починаючи з однієї адреси.

Приклад:

union { char fio[30];

char adres[80];

int vozrast;

int telefon; } inform;

union { int ax;

char al[2]; } ua;

При використанні об'єкта inform типу union можна обробляти тільки той елемент який одержав значення, тобто після присвоєння значення елементу inform.fio, не має змісту звертатися до інших елементів. Об'єднання ua дозволяє одержати окремий доступ до молодшого ua.al[0] і до старшого ua.al[1] байта двохбайтового числа ua.ax .

Динамічний розподіл пам’яті

Крім статичної пам’яті, яка виділяється при описі та ініціалізації змінних, в мові С є можливість додатково виділяти пам’ять під час виконання програми. Для цього використовуються функції malloc(), calloc() з бібліотеки alloc.h.

Синтаксис :

void* malloc(int);

void* calloc(int,int);

Форма звертання до функції malloc() наступна:

ім'я вказівника=(тип вказівника)malloc(об'єм ОП);

де

ім'я вказівника – ім'я змінної-вказівника;

тип вказівника – тип значення, що повертається функцією malloc;об'єм ОП – кількість байтів ОП, що виділяються змінній, яка адресується.

Форма звертання до функції сalloc() наступна:

ім'я вказівника=(тип вказівника) сalloc(count,size);

де

ім'я вказівника – ім'я змінної-вказівника;

тип вказівника – тип значення, що повертається функцією calloc; count – кількість комірок ОП, що виділяються змінній, яка адресується;

size – розмір кожної комірки в байтах.

Звільнення пам’яті, виділеної за їх допомогою, відбувається функцією free().

Синтаксис :

Void free(void*);

Приклад динамічного виділення пам‘яті для тривимірного масиву символів.

int n=5,m=3,k=4,i,j,l,с;

//розмір пам’яті під довільний вказівник - 2

//байти, sizeof(char**)=2

char ***Cube = (char***)calloc(n,sizeof(char**)); for(i=0;i<n;i++)

{ Cube[i] = (char**)calloc(m,sizeof(char*)); for(j=0;j<m;j++) Cube[i][j] = (char*)malloc(k);

}

//заповнення таблиці символами

с=65;// Cимвол ‘А’ for(i=0;i<n;i++) for(j=0;j<m;j++) for(l=0;l<k;l++) Cube[i][j][l] = с++;

//звільнення пам’яті

for(i=0;i<n;i++) { for(j=0;j<m;j++) free(Cube[i][j]); free(Cube[i]); } free(Cube);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]