Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.9.1 Основні поняття - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.9.1 Основні поняття

Між покажчиками і масивами існує тісний взаємозв'язок. Будь-яка дія над елементами масивів, що досягається індексуванням, може бути виконана за допомогою покажчиків (посилань) і операцій над ними. Варіант програми з покажчиками буде виконаний швидше, але для розуміння він складніший.

Як показує практика роботи на Сі, покажчики рідко використовуються зі скалярними змінними, а частіше - з масивами. Покажчики дають можливість застосовувати адреси приблизно так, як це робить ЕОМ на машинному рівні. Це дозволяє ефективно організувати роботу з масивами. Будь-яку серйозну програму, що використовує масиви, можна написати за допомогою покажчиків.

Для роботи з масивом необхідно:

1.      визначити ім'я масиву, його розмірність (кількість вимірів) і розмір - кількість елементів масиву;

2.       виділити ОП для його розміщення.

У мові Сі можна використовувати масиви даних будь-якого типу:

•   статичні: з виділенням ОП до початку виконання функції; ОП виділяється в стеку або в ОП для статичних даних;

•   динамічні: ОП виділяється з купи в процесі виконання програми, за допомогою функцій таІІос() і саІІос().

Динамічні змінні використовують, якщо розмір масиву невідомий до початку роботи програми і визначається в процесі її виконання, наприклад за допомогою обчислення або введення.

Розмір масиву визначається:

1.       для статичних масивів при його оголошенні; ОП виділяється до початку виконання програми; ім'я масиву - покажчик-константа; кількість елементів масиву визначається:

a.    явно; наприклад: іпі а[5];

b.    неявно, при ініціалізації елементів масиву; наприклад: іп'Ь а [] = { 1, 2, 3 } ;

2.       для динамічних масивів у процесі виконання програми; ОП для них запитується і виділяється динамічно, з купи; ім'я покажчика на масив - це змінна; масиви ці можуть бути:

a.    одновимірні і багатовимірні; при цьому визначається кількість елементів усього масиву й ОП запитується для всього масиву;

b.    вільні (спеціальні двовимірні); при цьому визначається кількість рядків і кількість елементів кожного рядка, і ОП запитується і виділяється для елементів кожного рядка масиву в процесі виконання програми; при використанні вільних масивів використовують масиви покажчиків;

Розмір масиву можна не вказувати. В цьому разі необхідно вказати порожні квадратні дужки:

1.       якщо при оголошенні ініціалізується значення його елементів; наприклад:

з'Ьа'Ьіс іп£ а[] = {1, 2, 3}; сЬаг Ь[] = "Відповідь:";

2.       для масивів - формальних параметрів функцій; наприклад:

іп£ £ип1(іп^ а[], іп£ п); іп£ £ип2(іп£ Ь[к][т][п]);

3.       при   посиланні на раніше         оголошений зовнішній      масив;

наприклад:

іп£ а[5]; /*   оголошення зовнішнього масиву */

таіп ()

{

ех'Ьегп іп£ а [];/*посилання на зовнішній масив */

}

В усіх оголошеннях масиву ім'я масиву - це покажчик-константа! Для формування динамічного масиву може використовуватися тільки ім'я покажчика на масив - це покажчик-змінна. Наприклад:

іп£ *т1                      = (іп£ * ) таІІос (                                  100 * зігео£ (іп£))                              ;

£1оа£ *т2               = (£1оа£ * ) таІІос                              ( 200 * зігео£ (£1оа£))                                       ;

де ті - змінна-покажчик на масив   100 значень типу іпґ;

т2 - змінна-покажчик на масив 200 значень типу/Іоаґ.

Звільнення виділеної ОП відбувається за допомогою функції:

£гее (покажчик-змінна)                             ;

Наприклад:

£гее(т1);

£гее(т2);

Звертання до елементів масивів ті і т2 може виглядати так: т1 [і] , т2[]].

Пересилання масивів у Сі немає. Але можна переслати масиви поелементно або сумістити масиви в ОП, давши їм практично те саме ім'я.

Наприклад:

іп£ *т1 = (іп£ *) та11ос(100 * зігео£(іп^)); іп£ *т2 = (іп£ *) та11ос(100 * зігео£(іп^));

Для пересилання елементів одного масиву в іншій можна використати оператор циклу:

£ог (і = 0; і < 100; і++ ) т2[і] = т1 [і] ;

Замість т2[і] = т1 [і]; можна використовувати:

*т2++ = *т1++; або: *(т2 + і) = *(т1 + і) ;

За допомогою покажчиків можна сполучити обидва масиви й у такий спосіб:

£гее(т2); т2 = т1 ;

Після цього обидва масиви займатимуть одну й ту саму область ОП, виділену для масиву ті. Однак це не завжди припустимо. Наприклад, коли масиви розташовані в різних типах ОП: один - у стеку, інший - у купі. Наприклад, у функції таіп() оголошені:

іп£ *т1 = (іп£ *) та11ос(100* зі2во£(іп^)); іп£ т2[100]  ;

У вищенаведеному прикладі ті - пакажчик-змінна, і масив ті розташований у купі, т2 - покажчик-константа, і масив т2 розташований у стеку. У цьому випадку помилковий оператор: т2 = ті; тому що т2 - це покажчик-константа. Але після /гее(ті) припустимим є оператор:

т1 = т2; /* оскільки т1 - покажчик-змінна */

Для доступу до частин масивів і до елементів масивів використовується індексування (індекс). Індекс - це вираз, що визначає адресу значення або групи значень масиву, наприклад адреса значень чергового рядка двовимірного масиву. Індексування можна застосовувати до покажчиків-змінних на одновимірний масив - так само, як і до покажчиків-констант.

Індексний вираз обчислюється шляхом додавання адреси початку масиву з цілим значенням для одержання адреси необхідного елемента або частини масиву. Для одержання значення за індексним виразом до результату - адреси елемента масиву застосовується операція непрямої адресації (*), тобто одержання значення за заданою адресою. Відповідно до правил обчислення адреси цілочисельний вираз, що додається до адреси початку масиву, збільшується на розмір кванта ОП типу, що адресується покажчиком.

Розглянемо способи оголошення і формування адрес частини масиву й елементів одновимірних і багатомірних масивів за допомогою покажчиків.

 

50