- •Елементи мови с.Основні символи
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Лексеми
- •Коментарі
- •Умовні оператори. Логічні вирази
- •Форми оператора if
- •Оператор вибору switch
- •Перерахування типів
- •Перетворення типів
- •Оператори циклу
- •Оператор while
- •Оператор for
- •Оператор do-while
- •Оператори переходу
- •Cтруктури
- •Об'єднання (суміші)
- •Робота з структурами.
- •Ініціалізація структур
- •Робота з обєднаннями
- •Визначення об'єктів та типів
- •Методи доступу до елементів масивів
- •Покажчики на багатовимірні масиви
- •Операції з вказівниками
- •Робота з покажчиками.
- •Покажчики на структуру
- •Масиви структур
- •Динамічне розміщення масивів
- •Робота з динамічними масивами
- •Робота з непрямою адресацією
- •Робота з покажчиками як параметрами функцій
- •Використання вказівників
- •Операції з вказівниками
- •Використання вказівників в програмі
- •Робота з файлами
- •Відкриття файлу
- •Обробка відкритого файлу
- •Перевірка ознаки кінця файлу
- •Закриття файлу
- •Функції введення-виведення
- •Робота з текстовими файлами
- •Функція форматованого виведення printf ()
- •Основні формати
- •Модифікації форматів
- •Функція форматованого введення scanf ()
- •Робота функції scanf ()
- •Призначеня функцій бібліотеки введення-виведення
- •Макрокоманди
- •Потокові інтерфейси введення-виведення
- •Ближні покажчики (near)
- •Дальні покажчики (far)
- •Покажчики huge
- •Функції для роботи з рядками
- •Динамічні рядки, клас string
- •Визначення поточної робочої директорії
- •Визначення поточного каталогу диска
- •Визначення / встановленн поточного диска
- •Пошук файлу
- •Створення, видалення, зміна директорій
- •Приклад програми для роботи з директоріями
- •Перегляд каталогу диска
- •Параметри структури ffblk
- •Робота з клавіатурою
- •Робота з файлами
- •Послідовний доступ до елементів двійкових файлів
- •Організація довільного доступу до елементів двійкових файлів
- •Робота динамічних структур даних.
- •Функції управління пам'яттю
- •Атрибути файлів.
- •Параметри
- •Динамічні структури даніх
- •Лінійні списки
- •Стек. Загальні поняття.
- •Приклад використання стеку
- •Основні визначення
- •Приклад використання дерев
Покажчики на структуру
Якщо функції передається велика структура, то ефективніше передати покажчик на цю структуру, ніж копіювати її в стек цілком. Покажчик на структуру по виду нічим не відрізняється від покажчиків на звичайні змінні.
Формат: struct point * pp;
де pp - покажчик на структуру типу struct point, * pp - сама структура, (* pp). x і (* pp). y - члени структури.
Дужки (* pp). X необхідні, так як пріоритет операції (.) Вище пріоритету операції (*). У разі відсутності дужок * pp.x розуміється як * (pp.x).
Ініціалізація покажчика на структуру виконується так само, як і ініціалізація вказівників інших типів: struct point var1, * S1; тут var1 - структурна змінна, * S1 - вказівник на структуру.
Для визначення значення покажчика йому потрібно привласнити адресу вже сформованої структури:
S1 = &var1;
Тепер можливо ще одне звернення до елементів структури:
(* S1). Name.
Покажчики на структури використовуються досить часто, тому для доступу до її полях була введена коротка форма запису. Якщо р - покажчик на структуру, то p → <поле структури> зволяет звернутися до зазначеного полю структурної змінної.
Знак → (стрілка) вводиться з клавіатури за допомогою двох символів: '-' (мінус) і '>' (більше). Наприклад, pp → x; pp → y.
Оператори доступу до полів структури (.) І (→) разом з операторами виклику функції () та індексами масиву [] займають найвище положення в ієрархії пріоритетів операцій в мові C.
Покажчики на структуру використовуються у наступних випадках:
- Доступ до структур, розміщеним в динамічній пам'яті;
- Створення складних структур даних - списків, дерев;
- Передача структур в якості параметрів в функції.
Масиви структур
При необхідності зберігання деяких даних у вигляді декількох масивів однієї розмірності, але різного типу, можлива організація масиву структур. Наочно масив структур можна представити у вигляді таблиці, де стовпчики таблиці являють собою поля структури, а рядки - елементи масиву структур.
Наприклад, є два різнотипних масиву:
char c [N];
int i [N];
Оголошення
struct key
{
char c;
int i;
} Keytab [N];
створює тип структури key і оголошує масив keytab [N], кожен елемент якого є структура типу key.
Можливий запис:
struct key
{
char c;
int i;
};
struct key keytab [N];
Ініціалізація масиву структур виконується наступним чином:
struct key
{
char c;
int i;
} Keytab [] = {
'A', 0,
'b', 0
};
У цьому прикладі створюється масив на дві структури типу key з ім'ям keytab. Розглянемо звернення до поля структури в цьому випадку - для прикладу виведемо на екран вміст масиву:
for (int i = 0; i <2; i + +)
printf ("% c% d \ n", keytab [i]. c, keytab [i]. i);
При зверненні до поля структури спочатку відбувається звернення до елементу масиву (keytab [i]), а потім тільки звернення до поля структури (keytab [i]. C).
Доступ до поля елемента масиву структур може бути отриманий через константу-покажчик на масив і зміщення всередині масиву, наприклад, доступ до поля елемента масиву з номером i потрібно записати таким чином:
(* (Keytab + i)). C або (keytab + i) → c.
Масив структур також може бути переданий у функцію як аргумент, передача масиву відбувається через покажчик на масив.
Приклад програми, в якій масив точок формується і виводиться на екран за допомогою функцій:
# Include <stdio.h>
# Define N 5
struct point
{int x, y;
};
void form_mas (struct point * mas, int n)
{
printf ("Enter koordinates! \ n");
for (int i = 0; i <n; i + +)
{
printf ("x →");
scanf ("% d", & mas [i]. x);
printf ("y →");
scanf ("% d", & mas [i]. y);}}
void print_mas (struct point * mas, int n)
{printf ("x y \ n");
for (int i = 0; i <n; i + +)
printf ("% 4d% 6d \ n", (mas + i) → x, (mas + i) → y);
}
int main ()
{struct point Points [N];
form_mas (Points, N);
print_mas (Points, N);
return 0;}
Функція form_mas () заповнює масив точок, який переданий у функцію через покажчик mas. Параметр функції n визначає кількість елементів масиву. Доступ до елементу масиву - через операцію. (Крапка). Вираз & mas [i]. X обчислює адресу елемента структури mas [i]. X, так як операція & має нижчий пріоритет, ніж операції [] і • (точка).
Функція print_mas () виводить масив на екран. Передача масиву у функцію відбувається також через покажчик mas. Параметр n - кількість елементів масиву. Доступ до елементу масиву - через операцію → (стрілка).
Питання для контролю:
1.В якому випадку потрібно використовувати показники на структуру?
2. Як оголосити вказівник на структуру?
3.Як організувати масиви структур?
Література:
1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 132-134
Урок №27
(згідно робочої навчальної програми)
Тема: Динамічні масиви, масиви покажчиків
Питання:
1. Динамічне розміщення масивів
2. Робота з динамічними масивами
