C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C struct. union об'єднання


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

Для визначення об'єднань застосовується ключове слово union і має наступний формальний синтаксис:

union імя_об'єднання
{
    визначення_елементів
};

Фактично об'єднання визначається точно також, як і структура, тільки замість слова struct використовується ключове слово union .

Так, створимо найпростіше об'єднання:

union code
{
    int digit;
    char letter;
};

Об'єднання code зберігає в одному і тому ж ділянки пам'яті об'єкт int і об'єкт char. Конкретний розмір виділеної пам'яті буде залежати від системи і реалізації.

У цьому випадку об'єднання Сode на більшості платформ буде займати 4 байти. Довжина елементів, як тут, може бути різною, і в цьому випадку розмір об'єднання обчислюється по найбільшому елементу.

Після визначення об'єднання ми можемо створити його змінну і привласнити їй якесь значення:

union code id;

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

union code id = {120};

Для звернення до елементів об'єднання, як і у випадку зі структурами, можна використовувати операцію "точка":

#include <stdio.h>
 
typedef union code
{
    int digit;
    char letter;
};
 
int main(void)
{
    union code id;
    id.digit = 120;
    printf("%d - %c \n", id.digit, id.letter);  // 120 - x
    printf("%d - %d \n", id.digit, id.letter);  // 120 - 120
     
    id.letter = 87;
    printf("%d - %c \n", id.digit, id.letter);  // 87 - W
     
    return 0;
}

Варто відзначити, що, так як обидва елементи займають одну і ту ж пам'ять, то зміна одного з них призведе до зміни іншого. Так так ділянку пам'яті один, і дані фактично одні й ті ж, тільки при зверненні до id.digit дані інтерпретуються як об'єкт int, а при зверненні до id.letter - як об'єкт char.

За допомогою оператора typedef можна задати псевдонім для об'єднання:

typedef union code
{
    int digit;
    char letter;
} secret_code;

Тут псевдонімом є ідентифікатор secret_code , тому такі визначення змінних будуть аналогічні:

union code id = {22};
secret_code id2 = {22};

Також можна визначати анонімні об'єднання:

#include <stdio.h>
 
union
{
    int digit;
    char letter;
} id1, id2;     // переменные id1, id2
 
int main(void)
{
    id1.digit = 122;
    id2.digit = 84;
    printf("%d - %c \n", id1.digit, id1.letter);
    printf("%d - %c \n", id2.digit, id2.letter);
     
    return 0;
}

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

(* покажчик_на_обєднання).імя_елемента
покажчик_на_обєднання->імя_елемента

Використовуємо покажчики на об'єднання:

#include <stdio.h>
 
union code
{
    int digit;
    char letter;
};
 
int main(void)
{
    union code id = {45};
    union code * p_id = &id;
    printf("%d \n", p_id->digit);    // 45
    p_id->digit= 89;
    printf("%d \n", id.digit);      // 89
     
    return 0;
}

Наш партнер:
beta test mp3 playlist downloader