- •2. Основні елементи мови с
- •3.1 Алфавіт мови програмування
- •3.2Лексеми
- •3.3Ключові слова
- •3.4Ідентифікатори
- •3.5 Класифікація типів даних
- •3.6 Літерали
- •3.7 Оператори
- •3.8 Коментарі
- •3.9 Директиви препроцесора
- •3.10 Організація програми
- •3. Операції та вирази
- •4.1 Загальні відомості
- •4.2 Арифметичні операції
- •4.3 Операції приведення типів
- •(Тип) ідентифікатор,
- •4.4 Операції присвоєння
- •4.5 Операції інкремента і декремента
- •4.6 Операції порівняння
- •4.7 Операції зсуву
- •4.8 Порозрядні операції
- •4.9 Логічні операції
- •4.10 Операція sizeof
- •Sizeof ( Вираз ),
- •4.11 Операція послідовного обчислення
- •4.12 Операція умови (?:)
- •Операнд-1 ? Операнд-2 : Операнд-3
- •4.13 Адресні операції
- •Тип * ім'я_покажчика;
- •4. Прості типи даних
- •5.1 Оголошення змінних
- •[ Модифікатори ] тип ім’я_змінної;
- •5.2 Час існування та область видимості змінних
- •5.3 Цілі типи даних
- •5.4 Дійсні типи даних
- •5. Оператори керування
- •5.1 Оператор розгалуження if
- •If ( Вираз ) true-оператор;
- •5.2 Оператор розгалуження if-else
- •If ( Вираз ) true-оператор; else false-оператор;
- •5.3 Оператор множинного розгалуження switch
- •5.4 Оператор циклу for
- •For ( Вираз 1 ; Вираз 2 ; Вираз 3 ) тіло циклу
- •5.5 Оператор циклу while
- •While ( Вираз ) тіло циклу
- •5.6 Оператор циклу do while
- •Тіло циклу while ( Вираз ) ;
- •5.7 Оператор break
- •5.8 Оператор continue
- •6 Введення та виведення даних
- •7.1 Функція виведення printf
- •Int printf( стрічка форматування, змінна1, змінна2, ... );
- •7.2Функція введення scanf
- •Int scanf (стрічка форматування, адреса змінної1, адреса змінної2, ... );
- •9.1 Введення та виведення у файл
- •7 Масиви
- •7.1 Загальні поняття
- •7.2 Одновимірні масиви
- •Тип даних ім’я змінної [n];
- •7.3 Багатовимірні масиви
- •6. Функції
- •6.1 Основні поняття
- •{Тіло функції}
- •6.2 Область видимості
- •6.3 Порожній тип void
- •6.4 Передача аргументів у функцію
- •6.5 Рекурсивні функції
- •6.6 Прототипи функцій
- •8. Рядки в с
- •4.1 Прототипи
- •4.2 Функції перетворення буферів
- •4.3 Функції перевірки літер
- •4.4 Рядок символів
- •4.5 Операції з рядками:
- •4.6 Символьні константи
- •9. Покажчики
- •5.1 Визначення та ініціалізація покажчиків
- •5.2 Визначення покажчиків:
- •5.3 Масиви
- •5.6 Копіювання рядка
- •5.7 Посилання та оператор &
- •5.9 Посилання в якості результатів функції
- •5.10 Покажчики на функцію
- •Тип_функціі (* імя_покажчика) (специфікація_параметрів);
- •5.11 Покажчики на void
- •5.12 Арифметика покажчиків
- •10. Структури, об’єднання, перерахування
- •7.1 Структури
- •7.2 Ключове слово typedef
- •7.3 Об’єднання
- •7.4Перераховуваний тип (Enum)
- •Enum dataType
- •Enum day
- •11 Динамічне виділення пам'яті
7.3 Об’єднання
Об’єднання (union) – сукупність зв’язаних даних різних типів, для зберігання яких у пам’яті ЕОМ використовуються спільні копірки.
Синтаксис визначення об’єднання:
union <назва об’єднання>
{
<опис елементів>
};
Об'єднання використовуються коли необхідно отримати доступ до одних і тих же даних різними способами, або для економії пам’яті ЕОМ у випадку коли виключена можливість одночасного використання різних елементів об’єднання.
Оскільки для зберігання усіх елементів об’єднання використовується спільна область пам’яті, розмір змінної типу об’єднання є розміром найбільшого елементу, об’явленого в даному об’єднанні, на відміну від змінної типу структури, у якої розмір використовуваної пам’яті є сумою розмірів усіх елементів структури.
Приклад 17.Порівняння розмірів об’єднання і структури.
#include <stdio.h>
#include <stdlib.h>
unionun
{
int ivar;
int* pivar;
charpstr[8];
floatfvar;
long intlivar;
};
structst
{
intivar;
int* pivar;
charpstr[8];
floatfvar;
long intlivar;
};
intmain(void)
{
printf("Union size:\t%d\n",sizeof(unionun));
printf("Struct size:\t%d\n",sizeof(structst));
system("pause");
return 0;
}
Результат роботи програми:
Як бачимо з програмного коду прикладу 17, найбільший розмір і у структурі і у об’єднанні займає елементpstr[8](8 байт). У випадку об’єднання розмір цього елементу і визначає розмір змінної типу об’єднання.
Синтаксично робота зі змінними типу об’єднання аналогічна роботі зі змінними типу структур. Але синтаксис опису змінних типу об’єднання відрізняється:
union <назва об’єднання> < ім’я змінної>;
Як і у випадку зі структурами, використання ключового слова union є обов’язковим. Також дозволяється описувати змінні типу об’єднання одразу після визначення об’єднання.
Приклад 18.Робота з об’єднаннями.
#include <stdio.h>
#include <stdlib.h>
unionun
{
int ivar;
charpstr[8];
};
intmain(void)
{
unionun 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;
}
Результат роботи програми:
Приклад 18 демонструє спільне використання однієї області пам’яті декількома різними об’єктами об’єднання. Графічне представлення образу змінної un_varу пам’яті показано на рисунку 7.2.
Рисунок 7.2 – Змінна типу об’єднання у пам’яті.
Подібне використання пам’яті, окрім економії останньої, надає змогу зручного доступу до однакових даних різними способами, а також дозволяє проводити нестандартні приведення типів даних.
Приклад 19.Приклад організації доступу до однієї області пам’яті різними способами за допомогою об’єднань.
#include <stdio.h>
#include <stdlib.h>
uniondig
{
struct
{
intdigit0;
intdigit1;
intdigit2;
intdigit3;
} digits;
intdigit[4];
};
intmain(void)
{
uniondig data;
inti;
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;
}
Результат роботи програми:
Об’єднання, аналогічно структурам, можуть бути неіменованими. Такі об’єднання називаються анонімними.
Перевизначення об’єднаннь в межах однієї області видимості не дозволяються, за виключенням випадку коли перевизначення здійснюється в різних програмних блоках. У випадку визначення об’єднання у окремому програмному блоці, область видимості цього визначення закінчується з закінченням програмного блоку, в якому міститься це визначення.
Приклад 20.Області видимості визначень об’єднань.
union un /* Глобально-видиме визначення */
{
intivar;
charpstr[8];
};
voidfunc(void)
{
union un; /* Визначення, яке видиме тільки в межах
функції func */
{
int ivar;
char pstr[8];
float fvar;
};
/* ... */
}
/* ... */
Код, наведений у прикладі 20 є коректним. Але слід застерегти від подібного роду перевизначень, що суттєво ускладнюють розуміння і супроводження програм, написаних у такому стилі.