Рубрики

Союз в С

Как и Structures , union является определяемым пользователем типом данных. В объединении все члены имеют одну и ту же ячейку памяти.

Например, в следующей C-программе x и y находятся в одном и том же месте. Если мы изменим x, то увидим, что изменения отражаются в y.

#include <stdio.h>

  
// Декларация о союзе такая же как структура

union test {

    int x, y;

};

  

int main()

{

    // переменная объединения t

    union test t;

  

    t.x = 2; // Вы также получаете значение 2

    printf("After making x = 2:\n x = %d, y = %d\n\n",

           t.x, t.y);

  

    t.y = 10; // TX также обновляется до 10

    printf("After making y = 10:\n x = %d, y = %d\n\n",

           t.x, t.y);

    return 0;

}

Выход:

After making x = 2:
 x = 2, y = 2

After making y = 10:
 x = 10, y = 10

Как размер объединения определяется компилятором?
Размер союза берется в соответствии с размером самого большого члена в союзе.

#include <stdio.h>

  

union test1 {

    int x;

    int y;

} Test1;

  

union test2 {

    int x;

    char y;

} Test2;

  

union test3 {

    int arr[10];

    char y;

} Test3;

  

int main()

{

    printf("sizeof(test1) = %lu, sizeof(test2) = %lu, "

           "sizeof(test3) = %lu",

           sizeof(Test1),

           sizeof(Test2), sizeof(Test3));

    return 0;

}

Выход:

sizeof(test1) = 4, sizeof(test2) = 4, sizeof(test3) = 40

Указатели на союзы?
Подобно структурам, мы можем иметь указатели на объединения и можем получать доступ к членам с помощью оператора стрелки (->). Следующий пример демонстрирует то же самое.

#include <stdio.h>

  

union test {

    int x;

    char y;

};

  

int main()

{

    union test p1;

    p1.x = 65;

  

    // p2 - указатель на объединение p1

    union test* p2 = &p1;

  

    // Доступ к членам объединения по указателю

    printf("%d %c", p2->x, p2->y);

    return 0;

}

Выход:

65 A

Каковы заявления союза?
Объединения могут быть полезны во многих ситуациях, когда мы хотим использовать одну и ту же память для двух или более членов. Например, предположим, что мы хотим реализовать структуру данных бинарного дерева, в которой каждый конечный узел имеет двойное значение данных, в то время как каждый внутренний узел имеет указатели на два дочерних элемента, но нет данных. Если мы объявим это как:

struct NODE {

    struct NODE* left;

    struct NODE* right;

    double data;

};

тогда каждому узлу требуется 16 байтов, причем половина байтов теряется на каждый тип узла. С другой стороны, если мы объявим узел следующим образом, мы сможем сэкономить место.

struct NODE {

    bool is_leaf;

    union {

        struct

        {

            struct NODE* left;

            struct NODE* right;

        } internal;

        double data;

    } info;

};

Приведенный выше пример взят из книги « Компьютерные системы: перспектива программиста» (английский), 2-е издание .

Ссылки:
http://en.wikipedia.org/wiki/Union_type
Компьютерные системы: взгляд программиста (английский) 2-е издание

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Союз в С

0.00 (0%) 0 votes