Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

Length *lengths[];

Аналогично объявлСниС

typedef char *String;

Π΄Π΅Π»Π°Π΅Ρ‚ String синонимом char *, Ρ‚. e. ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° char, ΠΈ ΠΏΡ€Π°Π²ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π΅Π³ΠΎ использованиС:

String Ρ€, lineptr[MAXLINES], alloc(int);

int strcmp(String, String);

p = (String) malloc(100);

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΉ Π² typedef Ρ‚ΠΈΠΏ стоит Π½Π° мСстС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ объявлСнии, Π° Π½Π΅ сразу Π·Π° словом typedef. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса слово typedef Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ класс памяти - extern, static ΠΈ Ρ‚. Π΄. ИмСна Ρ‚ΠΈΠΏΠΎΠ² записаны с Π·Π°Π³Π»Π°Π²Π½Ρ‹Ρ… Π±ΡƒΠΊΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΠ»ΠΈΡΡŒ.

Для дСмонстрации Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² примСнСния typedef Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этим срСдством ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ² Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π², с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅.

typedef struct tnode *Treeptr;

typedef struct tnode {/* ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π°: */

 char *word; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° тСкст */

 int count; /* число Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ */

 Treeptr left; /* Π»Π΅Π²Ρ‹ΠΉ сын */

 Treeptr right; /* ΠΏΡ€Π°Π²Ρ‹ΠΉ сын */

} Treenode;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… названия Ρ‚ΠΈΠΏΠΎΠ²: Treenode (структура) ΠΈ Treeptr (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру). Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ talloc ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅:

Treeptr talloc(void) {

 return (Treeptr) malloc(sizeof(Treenode));

}

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ объявлСниС typedef Π½Π΅ создаСт объявлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΎΠ½ΠΎ лишь сообщаСт Π½ΠΎΠ²ΠΎΠ΅ имя ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Никакого Π½ΠΎΠ²ΠΎΠ³ΠΎ смысла эти Π½ΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π½Π΅ нСсут, ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² точности с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ свойствами, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Ρ‚Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π±Π΅Π· пСрСимСнования Ρ‚ΠΈΠΏΠ°. ЀактичСски typedef Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ #define с Ρ‚Π΅ΠΌ лишь ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ компилятором ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΎΠΉ тСкстовой подстановкой, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° прСпроцСссором. НапримСр

typedef int (*PFI)(char *, char *);

создаСт Ρ‚ΠΈΠΏ PFI - "ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π΄Π²ΡƒΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° char *), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ int", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сортировки, описанной Π² Π³Π»Π°Π²Π΅ 5, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΎΠΌ контСкстС:

PFI strcmp, numcmp;

Помимо просто эстСтичСских сообраТСний, для примСнСния typedef ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. ΠŸΠ΅Ρ€Π²Π°Ρ - парамСтризация ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, связанная с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ пСрСносимости. Если с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ typedef ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ машинно-зависимыми, Ρ‚ΠΎ ΠΏΡ€ΠΈ пСрСносС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ потрСбуСтся внСсти измСнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² опрСдСлСния typedef. Одна ΠΈΠ· распространСнных ситуаций - использованиС typedef-ΠΈΠΌΠ΅Π½ для Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ†Π΅Π»Ρ‹ΠΌΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°ΠΌΠΈ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ установки short, int ΠΈΠ»ΠΈ long, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ установкам стандартных Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ size_t ΠΈ ptrdiff_t.

Вторая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎΠ±ΡƒΠΆΠ΄Π°ΡŽΡ‰Π°Ρ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ typedef,- ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ясным тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΠΏ, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ Π’reeptr (ΠΎΡ‚ английских слов tree - Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ pointer - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ), Π±ΠΎΠ»Π΅Π΅ понятСн, Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚ΠΈΠΏ, записанный ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ структуру.

6.8 ОбъСдинСния

ОбъСдинСниС - это пСрСмСнная, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ (Π² Ρ€Π°Π·Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ². ВсС трСбования ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈ выравнивания выполняСт компилятор. ОбъСдинСния ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ области памяти Π±Π΅Π· Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ машинно-зависимой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΈ срСдства Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½Ρ‹ΠΌ записям Π² ПаскалС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ использования объСдинСний ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΠΎΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ сам компилятор, Π·Π°Π²Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ символов, Ссли ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ константа ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ int, float ΠΈΠ»ΠΈ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° символ ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ char *. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ константы Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ этой константС Ρ‚ΠΈΠΏΠ°. Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ символов всСгда ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, Ссли значСния Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ ΠΏΠΎ ΠΎΠ±ΡŠΡ‘ΠΌΡƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ мСстС нСзависимо ΠΎΡ‚ своСго Ρ‚ΠΈΠΏΠ°. ЦСль ввСдСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ объСдинСния - ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π±Ρ‹ Π½Π° Π·Π°ΠΊΠΎΠ½Π½Ρ‹Ρ… основаниях Ρ…Ρ€Π°Π½ΠΈΠ»Π° Π² сСбС значСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Бинтаксис объСдинСний Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ синтаксису структур. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ объСдинСния.

union u_tag {

 int ival;

 float fval;

 char *sval;

} u;

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ u Π±ΡƒΠ΄Π΅Ρ‚ достаточно большой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΉ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΠ»Π°ΡΡŒ любая пСрСмСнная ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ²: Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· этих Ρ‚Ρ€Π΅Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ u ΠΈ Π΄Π°Π»Π΅Π΅ использовано Π² выраТСниях, Ссли это ΠΏΡ€Π°Π²ΠΎΠΌΠ΅Ρ€Π½ΠΎ, Ρ‚. Π΅. Ссли Ρ‚ΠΈΠΏ взятого Сю значСния совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ послСднСго присвоСнного Π΅ΠΉ значСния. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этого трСбования Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ - Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π½Π° совСсти программиста. Π’ Ρ‚ΠΎΠΌ случаС, Ссли Π½Π΅Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½ΠΎ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π° извлСкаСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Бинтаксис доступа ΠΊ элСмСнтам объСдинСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

имя-объСдинСния.элСмСнт

ΠΈΠ»ΠΈ

ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ-Π½Π°-объСдинСниС-›элСмСнт

Ρ‚. Π΅. Π² точности Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ Π² структурах. Если для хранСния Ρ‚ΠΈΠΏΠ° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния u ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, скаТСм, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ utype, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

if (utype == INT)

 printf("%d\n", u.ival);

else if (utype == FLOAT)

 printf("%f\n", u.fval);

else if (utype == STRING)

 printf("%s\n", u.sval);

else

 printf ("Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ %d Π² utype\n", utype);

ОбъСдинСния ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² структуры ΠΈ массивы, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π—Π°ΠΏΠΈΡΡŒ доступа ΠΊ элСмСнту объСдинСния, находящСгося Π² структурС (ΠΊΠ°ΠΊ ΠΈ структуры, находящСйся Π² объСдинСнии), такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур. НапримСр, Π² массивС структур

struct {

 char *name;

 int flags;

 int utype;

 union {

  int ival;

  float fval;

  char *sval;

 } u;

} symtab[NSYM];

ΠΊ ival ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

symtab[i].u.ival

Π° ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ символу строки sval ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… способов:

*symtab[i].u.sval

symtab[i].u.sval[0]

ЀактичСски объСдинСниС - это структура, всС элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ смСщСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ адрСса ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ позволяСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² Π½Π΅ΠΉ самому Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ Π΅Π΅ элСмСнту, Π° Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ этой структуры удовлСтворяСт всСм Ρ‚ΠΈΠΏΠ°ΠΌ объСдинСния. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ ΠΊ структурам, годятся ΠΈ для объСдинСний, Ρ‚. Π΅. Π·Π°ΠΊΠΎΠ½Π½Ρ‹ присваиваниС объСдинСния ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ, взятиС адрСса ΠΎΡ‚ объСдинСния ΠΈ доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΅Π³ΠΎ элСмСнтам.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ объСдинСниС ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ u ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лишь Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° int.

Π’ Π³Π»Π°Π²Π΅ 8 (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Π²Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ памяти) ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ, примСняя объСдинСниС, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ располоТСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±Ρ‹Π»ΠΎ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½ΠΎ ΠΏΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π² памяти.

6.9 Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля

ΠŸΡ€ΠΈ Π΄Π΅Ρ„ΠΈΡ†ΠΈΡ‚Π΅ памяти ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π·Π°ΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΎΠ΄Π½ΠΎ слово ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Одна ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ситуаций, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰Π°ΡΡΡ Π² Π·Π°Π΄Π°Ρ‡Π°Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ† символов для компиляторов, - это объСдинСниС Π³Ρ€ΡƒΠΏΠΏ ΠΎΠ΄Π½ΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°ΠΆΠΊΠΎΠ². Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ нас Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΈ Π΄ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, интСрфСйсами с Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€ΠΎΠΉ Π²Π½Π΅ΡˆΠ½ΠΈΡ… устройств: здСсь Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ частям слова.

Π’ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΌ сСбС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Π΄ΡƒΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ символов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с Π½ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, прСдставляСт Π»ΠΈ ΠΎΠ½ собой ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΈ, Ссли это пСрСмСнная, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ классу ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚: внСшняя ΠΈ/ΠΈΠ»ΠΈ статичСская ΠΈ Ρ‚. Π΄. Π‘Π°ΠΌΡ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ способ кодирования Ρ‚Π°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ - Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°ΠΆΠΊΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ словС Ρ‚ΠΈΠΏΠ° char ΠΈΠ»ΠΈ int.

Один ΠΈΠ· распространСнных ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚Π°ΠΌΠΈ основан Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π°Π±ΠΎΡ€Π° "масок", ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… позициям этих Π±ΠΈΡ‚ΠΎΠ², ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²

#define KEYWORD 01 /* ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово */

#define EXTERNAL 02 /* внСшний */

#define STATIC 04 /* статичСский */

ΠΈΠ»ΠΈ Π²

enum { KEYWORD = 01, EXTERNAL = 02, STATIC = 04 };

Числа Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ стСпСнями Π΄Π²ΠΎΠΉΠΊΠΈ. Π’ΠΎΠ³Π΄Π° доступ ΠΊ Π±ΠΈΡ‚Π°ΠΌ становится Π΄Π΅Π»ΠΎΠΌ "ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ", описанных Π² Π³Π»Π°Π²Π΅ 2 (сдвиг, маскированиС, взятиС дополнСния). НСкоторыС Π²ΠΈΠ΄Ρ‹ записи Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ довольно часто. Π’Π°ΠΊ,

flags |= EXTERNAL | STATIC;

устанавливаСт 1 Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΡ‚Π°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ flags,