
- •1.1 Історія виникнення
- •1.2 Елементи мови Сі
- •1.3 Структура програми. Базові типи даних
- •1.4 Основні операції
- •1.4.3 Операції порівняння
- •1.5 Основи алгоритмізації
- •1.7 Тип перерахування enum
- •1.8 Покажчики
- •1.9 Масиви
- •1.10 Масиви покажчиків
- •1.11 Символьні рядки
- •1.12 Основні методи сортування масивів
- •1.13 Структури
- •1.14 Об'єднання (union)
- •1.15 Файлові потоки
- •1.16 Функціональний підхід
- •1.17 Складені оголошення
- •1.19 Динамічні структури даних
1.10 Масиви покажчиків
За допомогою масивів покажчиків можна формувати великі масиви і вільні масиви - колекції масивів будь-яких типів.
1.10.1 Робота з великими масивами Розмір одного масиву даних повинний бути не більше 64 Кб. Але в реальних задачах можуть використовуватися масиви, що вимагають ОП, більшої ніж 64 Кб. Наприклад, масив даних типу float з 300 рядків і 200 стовпців потребує для розміщення 300 * 200 * 4 = 240000 байтів. Для вирішення поставленої задачі можна використовувати масив покажчиків і динамічне виділення ОП для кожного рядка матриці. Рядок матриці не повинен перевищувати 64 Кб. У вищенаведеному прикладі ОП для рядка складає всього 800 байтів. Для виділення ОП з купи кожен рядок повинний мати покажчик. Для всіх рядків масиву треба оголосити масив покажчиків, по одному для кожного рядка. Потім кожному рядку масиву виділити ОП, привласнивши кожному елементу масиву покажчиків адресу початку розміщення рядка в ОП, і заповнити цей масив. У запропонованому лістингу представлена програма для роботи з великим масивом цілих значень: з 300 рядків і 200 стовпців. Для розміщення він вимагає: 200 * 300 * 2 = 120000 байтів. При формуванні великого масиву використовується р - статичний масив покажчиків При виконанні програми перебираються i-номери рядків масиву. Для кожного рядка за допомогою функції malloc() виконується запит ОП з купи і формується p[i] - значення покажчика на дані i-рядки. Потім перебираються i-номери рядків від 1 до 200. Для кожного рядка перебираються j-номери стовпчиків від 1 до 300. Для кожного i та j за допомогою генератора випадкових чисел формуються і виводяться *(р[i] + j) - значення елементів масиву. Після обробки масиву за допомогою функції free(p[i]) звільняється ОП виділена i-рядку масиву. У наведеній нижче програмі використовуються звертання до Ai,j - елементів масиву у вигляді: *(p[i]+j), де p[i] + j - адреса Ai,j-елемента масиву. #include <conio.h> #include <stdlib.h> #include <stdio.h> void main() { int *p[200], i, j; clrscr(); randomize(); for (i=0;i<200;i++) /* Запит ОП для рядків великого масиву: */ p[i] = (int*) malloc (300 * sizeof (int)); for (i = 0; i < 200; i++) for (j = 0; j < 300; j++ ) { *(p[i] + j ) = random(100); printf("%3d", *(p[i] + j )); if ( (j + 1) % 20 == 0 ) printf ("\n" ) ; } /* Звільння ОП рядків великого масиву: */ for ( i=0; i < 200; i++ ) free( p[i] ); } У програмі використовується р - масив покажчиків.
1.10.2
Вільні масиви та покажчики
Термін
"вільний" масив відносять до
двовимірних масивів. Вони можуть бути
будь-якого типу, у тому числі int, float, char
і типу структура. Вільний масив - це
двовимірний масив, у якому довжини його
рядків можуть бути різними. Для роботи
з вільними масивами використовуються
масиви покажчиків, що містять в собі
кількість елементів, рівну кількості
рядків вільного масиву. Кожен елемент
масиву покажчиків містить адресу початку
рядка значень вільного масиву. ОП
виділяється для кожного рядка вільного
масиву, наприклад за допомогою функції
malloc(),
і звільняється функцією free().
Для того щоб виконати функцію malloc(),
треба визначити кількість елементів у
рядку, наприклад із вводу користувача
або яким-небудь іншим способом. У
нульовому елементі кожного рядка
вільного масиву зберігається число,
рівне кількості елементів даного рядка
Дані в кожен рядок можуть вводитися з
файлу або з клавіатури в режимі діалогу.
Приклад вільного масиву цілих чисел
приведений на рис
1.12:
У
масиві на рис. 1.12 три рядки; у нульовому
стовпці кожного рядка стоїть кількість
елементів даного рядка. Далі - значення
елементів матриці.
Приклад
оголошення вільного масиву цілих, тобто
статичного масиву покажчиків на дані
типу int:
int
*а[100];
Для
масиву а приділяється ОП для 100 покажчиків
на значення цілого типу, по одному
покажчику на кожний з 100 рядків вільного
масиву. Після визначення кількості
елементів рядка для значень рядка
повинна бути виділена ОП і сформоване
значення покажчика в змінній a[i].
Цей покажчик посилається на область
ОП, виділену для значень і-рядка матриці.
Тільки після цього можна заносити в цю
ОП значення елементів вільного
масиву.
Реально
ОП - це лінійна послідовність перенумерованих
байтів. Елементи рядків вільного масиву
можуть бути розташовані підряд або
несуміжними відрізками ОП, виділеними
для рядків.