
- •1 Основні елементи мови с
- •1.1 Алфавіт мови програмування
- •1.2 Лексеми
- •1.3 Ключові слова
- •1.4 Ідентифікатори
- •1.5 Класифікація типів даних
- •1.6 Літерали
- •1.7 Оператори
- •1.8 Коментарі
- •1.9 Директиви препроцесора
- •1.10 Організація програми
- •2 Операції та вирази
- •2.1 Загальні відомості
- •2.2 Арифметичні операції
- •2.3 Операції приведення типів
- •2.4 Операції присвоєння
- •2.5 Операції інкремента і декремента
- •2.6 Операції порівняння
- •2.7 Операції зсуву
- •2.8 Порозрядні операції
- •2.9 Логічні операції
- •2.10 Операція sizeof
- •2.11 Операція послідовного обчислення
- •2.12 Операція умови (?:)
- •2.13 Адресні операції
- •3 Прості типи даних
- •3.1 Оголошення змінних
- •3.2 Час існування та область видимості змінних
- •3.3 Цілі типи даних
- •3.4 Дійсні типи даних
- •4 Оператори керування
- •4.1 Оператор розгалуження if
- •4.2 Оператор розгалуження if-else
- •4.3 Оператор множинного розгалуження switch
- •4.4 Оператор циклу for
- •4.5 Оператор циклу while
- •4.6 Оператор циклу do while
- •4.7 Оператор break
- •4.8 Оператор continue
- •5 Функції
- •5.1 Основні поняття
- •5.2 Види виклику функцій
- •5.3 Область видимості
- •5.4 Порожній тип void
- •5.5 Передача аргументів у функцію
- •5.6 Рекурсивні функції
- •5.7 Прототипи функцій
- •6 Покажчики
- •6.1 Визначення та ініціалізація покажчиків
- •6.2 Визначення покажчиків
- •6.3 Масиви
- •6.4 Операції порівняння
- •6.5 Копіювання рядка
- •6.6 Покажчики на функцію
- •6.7 Покажчики на void
- •6.8 Арифметика покажчиків
- •7 Масиви
- •7.1 Загальні поняття
- •7.2 Одновимірні масиви
- •7.3 Багатовимірні масиви
- •8 Рядки в с
- •8.1 Рядки
- •8.2.Створення рядків
- •8.3 Прототипи
- •8.3 Функції перетворення буферів
- •8.4 Функції перевірки літер
- •8.5 Операції з рядками
- •9 Структури, об’єднання, перерахування
- •9.1 Структури
- •9.2 Бітові поля
- •9.3 Ключове слово typedef
- •9.4 Об’єднання
- •9.5 Перераховуваний тип
- •10 Введення та виведення даних
- •10.1 Функція виведення printf
- •10.2Функція введення scanf
- •10.3 Введення та виведення у файл
- •11 Динамічне виділення пам'яті
9.4 Об’єднання
Об’єднання (union) – сукупність зв’язаних даних різних типів, для зберігання яких у пам’яті ЕОМ використовуються спільні комірки.
Синтаксис визначення об’єднання:
union <назва об’єднання>
{
<опис елементів>
};
Об'єднання використовуються коли необхідно отримати доступ до одних і тих же даних різними способами, або для економії пам’яті ЕОМ у випадку коли виключена можливість одночасного використання різних елементів об’єднання.
Оскільки для зберігання усіх елементів об’єднання використовується спільна область пам’яті, розмір змінної типу об’єднання є розміром найбільшого елементу, об’явленого в даному об’єднанні, на відміну від змінної типу структури, у якої розмір використовуваної пам’яті є сумою розмірів усіх елементів структури.
Приклад 9.15. Порівняння розмірів об’єднання і структури.
#include <stdio.h>
#include <stdlib.h>
union un
{
int ivar;
int * pivar;
char pstr[8];
float fvar;
long int livar;
};
struct st
{
int ivar;
int* pivar;
char pstr[8];
float fvar;
long int livar;
};
int main(void)
{
printf("Union size:\t%d\n", sizeof(union un));
printf("Struct size:\t%d\n", sizeof(struct st));
system("pause");
return 0;
}
Результат роботи програми:
Як бачимо з програмного коду прикладу 9.15, найбільший розмір і у структурі і у об’єднанні займає елемент pstr[8] (8 байт). У випадку об’єднання розмір цього елементу і визначає розмір змінної типу об’єднання.
Синтаксично робота зі змінними типу об’єднання аналогічна роботі зі змінними типу структур. Але синтаксис опису змінних типу об’єднання відрізняється:
union <назва об’єднання> < ім’я змінної>;
Як і у випадку зі структурами, використання ключового слова union є обов’язковим. Також дозволяється описувати змінні типу об’єднання одразу після визначення об’єднання.
Приклад 9.16. Робота з об’єднаннями.
#include <stdio.h>
#include <stdlib.h>
union un
{
int ivar;
char pstr[8];
};
int main(void)
{
union un un_var;
un_var.ivar = 0;
printf("un_var.ivar=%d\n",un_var.ivar);
printf("un_var.pstr>> ");
scanf("%s", un_var.pstr);
printf("un_var.ivar=%d\n", un_var.ivar);
printf("un_var.ivar>> ");
scanf("%d", &un_var.ivar);
printf("un_var.pstr=%s\n", un_var.pstr);
system("PAUSE");
return 0;
}
Результат роботи програми:
Приклад 9.16 демонструє спільне використання однієї області пам’яті декількома різними об’єктами об’єднання. Графічне представлення образу змінної un_var у пам’яті показано на рисунку 9.2.
Рисунок 9.2 Змінна типу об’єднання у пам’яті.
Подібне використання пам’яті, окрім її економії, надає змогу зручного доступу до однакових даних різними способами, а також дозволяє проводити нестандартні приведення типів даних.
Приклад 9.17. Приклад організації доступу до однієї області пам’яті різними способами за допомогою об’єднань.
#include <stdio.h>
#include <stdlib.h>
union dig
{
struct
{
int digit0;
int digit1;
int digit2;
int digit3;
} digits;
int digit[4];
};
int main(void)
{
union dig data;
int i;
printf("Vvedit' 4 chisla>> \n");
scanf("%d", &data.digits.digit0);
scanf("%d", &data.digits.digit1);
scanf("%d", &data.digits.digit2);
scanf("%d", &data.digits.digit3);
printf("Vi vvely taki chisla:\n");
for(i=0; i<4; i++)
printf("\t%d) %d\n", i+1, data.digit[i]);
system("PAUSE");
return 0;
}
Результат роботи програми:
Об’єднання, аналогічно структурам, можуть бути неіменованими. Такі об’єднання називаються анонімними.
Перевизначення об’єднань в межах однієї області видимості не дозволяються, за виключенням випадку коли перевизначення здійснюється в різних програмних блоках. У випадку визначення об’єднання у окремому програмному блоці, область видимості цього визначення закінчується після програмного блоку, в якому міститься це визначення.
Приклад 9.18. Області видимості визначень об’єднань.
union un /* Глобально-видиме визначення */
{
int ivar;
char pstr[8];
};
void func(void)
{
union un; /* Визначення, яке видиме тільки в межах
функції func */
{
int ivar;
char pstr[8];
float fvar;
};
}
Код, наведений у прикладі 9.18 є коректним. Але слід застерегти від подібного роду перевизначень, що суттєво ускладнюють розуміння і супроводження програм, написаних у такому стилі.