Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lek7_cpp_ukr.rtf
Скачиваний:
1
Добавлен:
18.11.2019
Размер:
60.79 Кб
Скачать

5

7. Масиви

1. Основні поняття.

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

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

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

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

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

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

• статичні: з виділенням ОП до початку виконання функції; ОП виділяється в стеку або в ОП для статичних даних; • динамічні: ОП виділяється з купи в процесі виконання програми, за допомогою функцій malloc() і calloc(). Динамічні змінні використовують, якщо розмір масиву невідомий до початку роботи програми і визначається в процесі її виконання, наприклад за допомогою обчислення або введення. Розмір масиву визначається: 1. для статичних масивів при його оголошенні; ОП виділяється до початку виконання програми; ім'я масиву - вказівник-константа; кількість елементів масиву визначається: a. явно; наприклад: int а[5]; b. неявно, при ініціалізації елементів масиву; наприклад: int а[] = { 1, 2, 3 }; 2. для динамічних масивів у процесі виконання програми; ОП для них запитується і виділяється динамічно, з купи; ім'я вказівника на масив - це змінна; масиви ці можуть бути: a. одновимірні і багатовимірні; при цьому визначається кількість елементів усього масиву й ОП запитується для всього масиву; b. вільні (спеціальні двовимірні); при цьому визначається кількість рядків і кількість елементів кожного рядка, і ОП запитується і виділяється для елементів кожного рядка масиву в процесі виконання програми; при використанні вільних масивів використовують масиви вказівників; Розмір масиву можна не вказувати. В цьому разі необхідно вказати порожні квадратні дужки: 1. якщо при оголошенні ініціалізується значення його елементів; наприклад:   static int а[] = {1, 2, 3};   char b[] = "Відповідь:"; 2. для масивів - формальних параметрів функцій; наприклад:   int fun1(int a[], int n);   int fun2(int b[k][m][n]); 3. при посиланні на раніше оголошений зовнішній масив; наприклад:   int а[5]; /* оголошення зовнішнього масиву */   main ()   {   extern int а[]; /*посилання на зовнішній масив */   } В усіх оголошеннях масиву ім'я масиву - це вказівник-константа! Для формування динамічного масиву може використовуватися тільки ім'я вказівника на масив - це вказівник-змінна. Наприклад:  int *m1 = (int * ) malloc ( 100 * sizeof (int)) ;  float *m2 = (float * ) malloc ( 200 * sizeof (float)) ; де m1 - змінна-вказівник на масив 100 значень типу int;     m2 - змінна-вказівник на масив 200 значень типу float. Звільнення виділеної ОП відбувається за допомогою функції: free (вказівник-змінна) ; Наприклад: free(ml); free(m2); Звертання до елементів масивів m1 і m2 може виглядати так: m1[i], m2[j]. Пересилання масивів у Сі немає. Але можна переслати масиви поелементно або сумістити масиви в ОП, давши їм практично те саме ім'я. Наприклад: int *m1 = (int *) malloc(100 * sizeof(int)); int *m2 = (int *) malloc(100 * sizeof(int)); Для пересилання елементів одного масиву в іншій можна використати оператор циклу: for (i = 0; i < 100; i++ ) m2[i] = ml [i] ; Замість m2[i] = m1 [i]; можна використовувати: *m2++ = *ml++; або: *(m2 + i) = *(ml + i) ; За допомогою вказівників можна сполучити обидва масиви й у такий спосіб: free(m2); m2 = ml ; Після цього обидва масиви займатимуть одну й ту саму область ОП, виділену для масиву m1. Однак це не завжди припустимо. Наприклад, коли масиви розташовані в різних типах ОП: один - у стеку, інший - у купі. Наприклад, у функції main() оголошені: int *m1 = (int *) malloc(100* sizeof(int)); int m2[100] ; У вищенаведеному прикладі m1 - пакажчик-змінна, і масив m1 розташований у купі, m2 - вказівник-константа, і масив m2 розташований у стеку. У цьому випадку помилковий оператор: m2 = m1; тому що m2 - це вказівник-константа. Але після free(m1) припустимим є оператор: m1 = m2; /* оскільки m1 - вказівник-змінна */ Для доступу до частин масивів і до елементів масивів використовується індексування (індекс). Індекс - це вираз, що визначає адресу значення або групи значень масиву, наприклад адреса значень чергового рядка двовимірного масиву. Індексування можна застосовувати до вказівників-змінних на одновимірний масив - так само, як і до вказівників-констант. Індексний вираз обчислюється шляхом додавання адреси початку масиву з цілим значенням для одержання адреси необхідного елемента або частини масиву. Для одержання значення за індексним виразом до результату - адреси елемента масиву застосовується операція непрямої адресації (*), тобто одержання значення за заданою адресою. Відповідно до правил обчислення адреси цілочисельний вираз, що додається до адреси початку масиву, збільшується на розмір кванта ОП типу, що адресується вказівником. Розглянемо способи оголошення і формування адрес частини масиву й елементів одновимірних і багатомірних масивів за допомогою вказівників.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]