- •1.1 Перші кроки
- •1.2 Змінні й арифметичні вирази
- •1.3 Твердження for
- •1.4 Символічні константи
- •1.5 Ввід і вивід знаків
- •1.5.1 Копіювання файла
- •1.5.2 Відлік символів
- •1.5.3 Відлік рядків
- •1.6 Масиви
- •1.7 Функції
- •1.8 Аргументи - виклик за значенням
- •1.9 Символьні масиви
- •1.10 Зовнішні змінні й область дії
- •2.1 Назви змінних
- •2.2 Типи даних і розміри
- •2.3 Константи
- •2.4 Оголошення
- •2.5 Арифметичні операції
- •2.6 Реляційні та логічні оператори
- •2.7 Перетворення типів
- •2.8 Оператори приросту та спаду
- •2.9 Розрядні оператори
- •2.10 Оператори та вирази присвоєння
- •2.11 Вирази умов
- •2.12 Пріоритет і послідовність обчислення
- •3.1 Вирази та блоки
- •3.3 Else if
- •3.4 Switch
- •3.5 Цикли while та for
- •3.6 Цикли do-while
- •3.7 Break і continue
- •3.8 Goto та мітки
- •4.1 Основні знання про функції
- •4.2 Функції, які не повертають цілих
- •4.3 Зовнішні змінні
- •4.4 Правила області дії
- •4.5 Файли заголовка
- •4.6 Статичні змінні
- •4.7 Регістрові змінні
- •4.8 Структура блоків
- •4.10 Рекурсія
- •4.11 Препроцесор c
- •4.11.1 Включення файлів
- •4.11.2 Заміна макросів
- •4.11.3 Обумовлене включення файлів
- •5.1 Покажчики й адреси
- •5.2 Покажчики й аргументи функцій
- •5.3 Покажчики та масиви
- •5.4 Арифметика адрес
- •5.5 Покажчики на символи та функції
- •5.6 Масив покажчиків; покажчики на покажчики
- •5.7 Багатовимірні масиви
- •5.8 Ініціалізація масиву покажчиків
- •5.9 Покажчики в порівнянні з багатовимірними масивами
- •5.10 Аргументи командного рядка
- •5.11 Покажчики на функції
- •5.12 Складні оголошення
- •6.1 Основні поняття про структури
- •6.2 Структури та функції
- •6.3 Масиви структур
- •6.4 Покажчики на структури
- •6.5 Структури зі зворотнім звертанням
- •6.6 Пошук по таблиці
- •6.7 Typedef
- •6.8 Сполуки
- •6.9 Розрядні поля
- •7.1 Стандартний ввід і вивід
- •7.2 Форматований вивід - printf
- •7.3 Списки аргументів довільної довжини
- •7.4 Форматований ввід - scanf
- •7.5 Доступ до файлів
- •7.6 Обробка помилок - stderr і exit
- •7.7 Ввід і вивід рядків
- •7.8 Додаткові функції
- •7.8.1 Операції з ланцюжками
- •7.8.2 Перевірка і перетворення класів символів
- •7.8.3 Ungetc
- •7.8.4 Виконання команд
- •7.8.5 Керування пам'яттю
- •7.8.6 Математичні функції
- •7.8.7 Генератор випадкових чисел
- •8.1 Дескриптори файлів
- •8.2 Низькорівневий ввід/вивід - read і write
- •8.3 Open, creat, close, unlink
- •8.4 Довільний доступ - lseek
- •8.5 Приклад: втілення fopen і getc
- •8.6 Приклад - перелік вмісту каталогів
- •8.7 Приклад - розподільник пам'яті
6.1 Основні поняття про структури
Створімо тепер декілька структур, придатних для графіки. Основним об'єктом є пункт, який має координати x і y, обидві цілі числа.
y
^
|
| . (4,3)
|
|
|
------+---------------> x
(0,0) |
|
Ці дві складові можна помістити в структуру, оголошену як:
struct point {
int x;
int y;
};
Ключове слово struct оголошує структуру, яка в свою чергу являється списком оголошень, включених у фігурні дужки. За словом struct може слідувати необов'язкова назва, яку називають «етикеткою структури» (як point у цьому прикладі). Етикетка присвоює назву структурі, і може використовуватись пізніше як скорочення для частин, оголошенних у фігурних дужках.
Змінні, вказані всередині, називаються елементами структури. Елемент структури, етикетка та звичайна, не включена в структуру, змінна можуть мати ту саму назву, не створюючи конфлікту, оскільки вони завжди розділені контекстом. Більше того, ті самі назви елементів можуть повторюватись у різних структурах, хоча, з міркувань стилю, таке використання назв можна застосувати хіба що для тісно взаємопов'язаних об'єктів.
Саме оголошення struct визначає новий тип. За правою закриваючою дужкою може слідувати список змінних, так само як і у випадку інших основних типів. Тобто, вираз
struct { ... } x, y, z;
синтаксично аналогічний
int x, y, z;
у тому сенсі, що обидва вирази оголошують змінні x, y і z як певного типу і зумовлюють відведення для них місця.
Оголошення структури, за яким не слідує список змінних, не зарезервує місця для зберігання; воно тільки описує зразок або форму структури. Однак, якщо оголошення включає етикетку, цю етикетку можна використати пізніше для означення окремих взірців структури. Так, наприклад, використовуючи вищенаведене оголошення point,
struct point pt;
визначить змінну pt, що являтиметься структурою типу struct point. Структуру (змінну типуstruct) можна започаткувати, якщо додати до її означення список ініціалізаторів, кожен з яких — це сталий вираз для окремих елементів структури:
struct point maxpt = { 320, 200 };
Автоматичну структуру також можна ініціювати через присвоєння або шляхом виклику функції, що повертає структуру правильного типу.
Елемент певної структури можна вказати у якомусь виразі конструкцією, що має форму
назва-структури.елемент
Оператор елемента структури «.» (крапка) зв'язує назву структури з одним з її елементів. Щоб вивести координати пункту pt, наприклад, нам потрібно вказати
printf("%d,%d", pt.x, pt.y);
або, щоб обчислити відстань від початку координат (0,0) до pt,
double dist, sqrt(double);
dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y);
Структури можуть гніздитися. Одним з представлень прямокутника може бути два пункти, що знаходяться у протилежних кутах:
y
^
|
| +----------+ pt2
| | |
| | |
| +----------+
| pt1
|
----+------------------> x
|
|
struct rect {
struct point pt1;
struct point pt2;
};
Структура rect включає дві структури point. Якщо ми оголосимо screen як
struct rect screen;
тоді
screen.pt1.x
посилається на координату x елемента pt1 структури screen.
