- •Лабораторна робота № 6
- •6. 1. Короткі теоретичні відомості Особливості застосування покажчиків
- •Зв'язок покажчиків з масивами
- •Декларація багатовимірного масиву :
- •Покажчики на покажчики
- •Динамічне розміщення даних
- •6. 2.2. Приклад створення консольного застосування
- •6.3. Індивідуальні завдання
- •6.4. Індивідуальні завдання
Лабораторна робота № 6
Тема: Обробка двомірних динамічних масивів.
Мета: вивчити поняття «покажчик», правила створення і прийоми обробки динамічних масивів на прикладі двомірного масиву.
6. 1. Короткі теоретичні відомості Особливості застосування покажчиків
Звернення до об'єктів будь-якого типу в мові C може проводитися по імені, як ми досі робили, і по покажчику (непряма адресація).
Покажчик - це змінна, яка може містити адресу деякого об'єкту в пам'яті комп'ютера, наприклад, адреса іншої змінної. Через покажчик, встановлений на змінну, можна звертатися до ділянки оперативної пам'яті (ОП), відведеної компилято-ром під її значення.
Покажчик оголошується таким чином:
тип * ID покажчика;
Перед використанням покажчик має бути ініційований або конкретною адресою, або значенням NULL (0) - відсутність покажчика.
З покажчиками пов'язано дві унарні операції: & і *. Операція & означає «узяти адреса», а операція разадресации * - «значення, розташоване за адресою», наприклад:
int x, *y; // х - змінна типу int, у - покажчик типу int
y = &x; // y - адреса змінної x
*y = 1; // за адресою y записати 1, в результаті x = 1
При роботі з покажчиками можна використовувати операції складання, віднімання і порівняння, причому виконуються вони в одиницях того типу, на який встановлений покажчик.
Операції складання, віднімання і порівняння (більше/менше) мають сенс тільки для послідовно розташованих даних - масивів. Операції порівняння «==» і «!=» мають сенс для будь-яких покажчиків, тобто якщо два покажчики рівні між собою, то вони вказують на одну і ту ж змінну.
Зв'язок покажчиків з масивами
Покажчики і масиви тісно пов'язані між собою. Ідентифікатор масиву є покажчиком на його перший елемент, тобто для масиву int a[10], вирази a і a[0] мають однакові значення, оскільки адреса першого (з індексом 0) елементу масиву - це адреса початку розміщення його елементів в ОП.
Нехай оголошені - масив з 10 елементів і покажчик типу double :
double a[10], *p;
якщо p = a; (встановити покажчик p на початок масиву a)то наступні звернення: a[i], *(a+i) і *(p+i) еквівалентні, тобто для будь-яких покажчиків можна використовувати дві еквівалентні форми доступу до елементів масиву : a[i] і *(a+i). Очевидна еквівалентність наступних виразів :
&a[0] ( &(*p) ( p
Декларація багатовимірного масиву :
тип ID[розмір 1][розмір 2].[розмір N];
причому швидше змінюється останній індекс, оскільки багатовимірні масиви розміщуються в ОП в последователь-ности стовпців, наприклад, масив цілого типу, що складається з двох рядків і трьох стовпців (з ініціалізацією початкових значень)
int a[2][3] = 0,1,2,3,4,5;
у ОП буде розміщений таким чином:
a[0][0]=0, a[0][1]=1, a[0][2]=2, a[1][0]=3, a[1][1]=4, a[1][2]=5.
Якщо в списку ініціалізаторів даних не хапає, то відповідному елементу привласнюється значення 0.
Покажчики на покажчики
Зв'язок покажчиків і масивів з одним виміром справедливо і для масивів з бóльшим числом вимірів.
Якщо розглядати попередній масив (int a[2][3];) як масив двох масивів розмірністю по три елементи кожен, то звернення до елементу а[i][j] відповідає эквива-лентное вираження *(*(а+i)+j), а оголошення цього масиву з використанням покажчиків матиме вигляд
int **а;
Таким чином, ім'я двомірного масиву - ID покажчика на покажчик.