Загрузка [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js
 

printМассивы, строки и структуры

printОбъединения

Объединение в языке С связано с математическим понятием объединения множеств. Например, мы можем объединить множество целых чисел и множество символов CC:
A = ZZ cup CC

Значение a in A может быть либо целым числом, либо символом, но не одновременно. Для хранения значения такого типа достаточно использовать max(sizeof(int),sizeof(char)) байт памяти, но нужно где-то хранить информацию, из какого множества используется значение.

Объявление типа для объединения похоже на объявление типа для структуры, и рекомендуется объявить перечисление для переменной, хранящей информацию о варианте. Обращение к нужному варианту значения выглядит как обращение к полю структуры. Значение, указанное в списке инициализации, всегда используется для первого варианта, но можно явно указать имя варианта через tt"." "имя_варианта" ="выражение"

#include <stdio.h>
typedef union { 
  long i;
  char c;
  struct { double x, y; } point;
} unionA;
typedef enum { isLONG, isCHAR, isPOINT } tipA;
int main() {
  unionA a={-1}; // значение типа long
  tipA ta=isINT; // текущий тип a, попробуйте изменить на isPOINT
  switch(ta) {
    case isLONG: printf("%ld\n", a.i);
      break;
    case isCHAR: printf("%c\n", a.c);
      break;
    case isPOINT: printf("%lf %lf\n", a.point.x, a.point.y);
  }
}
Ввод:

Выполнить
Вывод:

Чаще всего объединение и переменная для текущего типа хранятся как два поля в одной структуре.

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

loading